ASRock BC-250 보드 RAZER CORE X CHROMA 에 설치하기 5

주문 제작 하였던 브라켓이 도착하였다.  재질은 철이 아니고 알루미늄이라 그런지 상당히 가볍고 잘못하면 휘어질 것 같은 느낌이 든다. 제작하고 수령하기 까지 거의 3주라는 긴 시간이 걸렸다. 원래 이렇게 까지 걸리진 않는데 원인은 가공 엔지니어로 부터 온 메일을 확인하지 않고 3일이나 흐른 뒤에 답장을 하였고, 연말 기간도 걸려서 늦어져 버렸다. BC-250 카드에 기존 브라켓을 제거하고 새로 설계한 브라켓을 달아보니 아주 잘 맞았다. 버튼도 잘 눌리고 이더넷, USB, DP 포트 모두 사용에 문제가 없다. 이렇게 보고 나서 알아차린 부분이지만 하단 쪽에 고정 다리를 추가한다는 것을 빼먹었다. 다시 만드는 건 금액도 만만치 않았기 때문에 수정해서 발주를 다시 넣지는 않을 예정이고 튼튼하게 고정하기 위해 다른 솔루션을 찾아 보려고 한다. 사실 브라켓을 설계한 건 설치 문제도 있지만 완성된 시스템이 외관상으로 봤을 때 튀는 부분 없이 완성도가 높아 보이길 원했기 때문이다. 이렇게 보니 모양도 그럴싸하고 원래 이런 제품일지도 모른다는 착각도 든다. 타공 모양도 벌집 모양으로 했으면 더 완벽했겠지만 만드는 동안에는 그런 생각 없이 만들었기 때문에 큰 후회는 없다. 장착 되어있던 USB 허브 보드 대신 사용될 PCB도 도착하였다. 기존 허브 보드와 비교하자면 사이즈만 많이 커졌지만 브라켓과 호환이 되는지 확인하였고 장착하는 데는 문제가 없을 것으로 예상하고 있다.  지금 보니 오디오 앰프가 꼭 있어야 했는지 살짝 욕심이 과했다는 생각도 든다. 조립에 사용될 부품들은 아직 수급 중이며 차근차근 조립을 해 나갈 예정이다. 먼저 설계했던 PSU 전원 컨트롤 보드는 다음과 같이 장착 되었고 주요 동작에는 큰 이상이 없으나 몇 가지 수정 사항이 생겼다. 수정 사항은 허브 보드을 새로 설계하면서 발생한 것으로 두 보드 간에 별도의 통신 선이 연결된다. 사실 이렇게 기능을 분리할 필요는 없었는데 첫 번째로 만든 보드에서 하드웨어 적으로 누락된 기능이 있기 때문에 허...

[Arduino] - rc car 만들기


Arduino로 넘어오면서 원점으로 돌아왔지만 훨신 깔끔해졌다.
nRF 모듈과 Arduino Pro Mini 등을 이용했다. 라즈베리 파이로 만들었을때 보다 라이트 한 느낌이다. 아쉬운 점은 nRF은 3.3v 로 작동하지만, 가지고 있던 프로 미니는 5v 였다.
작동전압이 3.3v 인 프로 미니가 있으면 좀더 간단하게 만들 수 있다.




원래는 테스트만하고 기판을 따로 만들어 줄 예정이었지만 Arduino Pro mini는 3.3출력이 없고, 빵판 파워 서플라이가 3.3를 뽑아줄 수 있기 때문에 그대로 사용했다.

스위치도 달려있고 좋다.
빵판으로 들어오는 전압은 ESC에 달려있는 BEC의 전압(6v)을 사용한다.


  • nRF24l01



nRF를 연결한 Arduino의 핀번호다. 송신측과 수신측 모두 같은 핀을 사용했다.
Servo는 5번 ESC의 시그널 핀은 6번을 사용하였다.
보기쉽게 적어 놓았으니 잘못 연결할 일은 없다.


  • ESC




전자변속기로도 불리는 ESC에는 기본적으로 모터에 연결되는 2선(브러시드) 혹은 3선(브러시리스), 전원입력 단자(사진 deans), 스위치, 컨트롤러 선을 포함한 BEC단자가 있다.
위 사진속 제품 가장 오른쪽에 검정(Ground), 적색(6v), 흰색(Signal) 단자가있다.
참고로 BEC의 전원선은 입력이 아니고 출력선이다.
수신기로 부터 흰색 선으로 심호만 입력받는다.

  • Servo


Servo모터는 일반적으로 황적갈의 3가지선을 갖고 있다.
적색은 전압(4.5~6v),
갈색은 그라운드(GND),
황색이 신호선(Signal)이다.
Servo모터의 전원는 ESC의 BEC에서 출력되는 6v를 사용했다.



회로가 역 전압이 발생할 수 있는 구조라면 입력 전원을 별도로 사용하는 것이 좋다.
다이오드를 다는 것도 좋은 방법이겠지만, 심하면 Arduino가 고장이 날 수도 있다.
따라서 아두이노와 다른 부품들이 서로다른 전원 공급구조를 가지고 있다면, 마지막으로 다른 부품들과 Arduino의 GND를 묶어주어야한다.
가장 흔히 빼먹는 실수 중 하나다.

이번 여름이 유난히 습하고 더워서 그런지 녹슨 부분이 많았고, 서보모터까지 고장나 있었다. 서보모터는 모터 브러쉬 부분이 타서 없어져있었다. 덕분에 여기까지 만드는데 시간이 상당히 결렸는다.



이건 송신기다.
내부에는 리튬이온 전지와 충전 모듈 그리고 Arduino nano, nRF모듈이 들어있다.
안경 케이스로 만들었는데 아누이노 led가 외부에서도 보인다.
의도한건 아닌데 생각보다 좋다.

송신기의 nRF로 수신기와 똑같다.
조이스틱은 스위치와 X축 Y축의 값을 얻어낼 수 있는데
아날로그 핀으로 값을 읽어와서 적절한 값으로 튜닝을 해주고 수신기로 보내주면된다.



부품들 중에는 가끔 납땜이 잘못 된 경우도있다. 값이 이상하게 나온다면 확인이 필요하다.


  • 과거모습


Raspberry Pi로 작동할때 모습이다.
wifi 또는 블루투스를 통해 작동하였으며 실시간 동영상 스트리밍과 사진 찍기의 기능을 갖고 있었다. 전원은 Raspberry Pi는 보조배터리로 작동하였고 서보모터와 ESC는 12v배터리팩으로 부터 전원을 공급받았다. 조작은 Dualshock4를 사용 하였다.
하지만 Raspberry Pi는 사망하였고 Arduino로 교체를 하게되었다.
사실 Raspberry Pi가 한 대 더 있지만 그냥 바꾸고 싶었다.



  • 소스코드

작동 순서를 간단하게 설명하자면,

1. 수신기의 전원을 모두 올린다.

2. 수신기 내부의 Calibration 값에 의해 MAX, MIN의 쓰로틀 값이 입력된다.

3. 송신기의 전원을 올리면 라디오가 사용가능한 상태가 되고 수신측에서 값을 받아오기 시작한다.

4. ESC는 송신기로부터 조이스틱의 idle값을 받아오게 된다.
이 값을 기준으로 정지해 있을지 전진을 할 지 후진을 할 지가 정해진다.

5. 송신측에서 보내온 값을 각각 Servo와 ESC의 신호선을 통해 값을 전달하게 되고, 그 값으로  rc car가 작동된다.

6. 조종하면 된다.


  • 수신 측 소스코드
/* @file Receive.ino
|| @version 1.1
|| @author Heejoong
|| #2018-08-20
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#define MAX_SIGNAL 2000
#define MIN_SIGNAL 1000
#define MOTOR_PIN 6
#define SERVO_PIN 5
RF24 radio(910); //CE, CSN
Servo esc_motor;
Servo front_servo;
int joystick[3];
const byte address[6= "00001"
//The address value can be changed to 5 strings, and the transmitter and the receiver must have the same address.
int motor;
int servo;
void setup() {
  Serial.begin(9600);
  Serial.println("Program begin...");
  Serial.println("This program will calibrate the ESC.");
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MAX);
  //Sets the power level. If the distance between modules is close, set to minimum.
  //It can be set to RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX etc. in order of close distance.
  //If you use RF24_PA_MAX, Recommended to use bypass capacitors at GND and 3.3V to have stable voltage during operation.
  
  esc_motor.attach(MOTOR_PIN);
  front_servo.attach(SERVO_PIN);
  radio.startListening();
  
  Serial.println("Now writing maximum output.");
  esc_motor.writeMicroseconds(MAX_SIGNAL);
  //delay(100);
  esc_motor.writeMicroseconds(MIN_SIGNAL);
  Serial.println("Sending minimum output");
  Serial.println("Please turn on the controller..."); //Set the idle value.
  //Do not operate the controller when turning it on. It cause calibration failure.
}
void loop() {
  if (radio.available()) {
    //The joystick recived from the nRF has a value betweent 1000 and 2000.
    radio.read(&joystick, sizeof(joystick));
    
    char buffer[20];
    sprintf(buffer , "X : %d, Y :  %d", joystick[1], joystick[2]);
    Serial.println(buffer);
    
    motor = joystick[1];
    servo = joystick[2];
    front_servo.write(servo);
    esc_motor.writeMicroseconds(motor);
  }
}
cs

  • 송신측 소스코드
/* @file Send.ino
|| @version 1.2
|| @author Heejoong
|| #
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(910); //CE, CSN
int joystick[3];
const byte address[6= "00001"
//The address value can be changed to 5 strings, and the transmitter and the receiver must have the same address.
int inputPinX = A1;
int inputPinY = A2;
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(address); //Set address
  radio.setPALevel(RF24_PA_MAX); 
  //Sets the power level. If the distance between modules is close, set to minimum.
  //It can be set to RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX etc. in order of close distance.
  //If you use RF24_PA_MAX, Recommended to use bypass capacitors at GND and 3.3V to have stable voltage during operation.
  
  radio.stopListening();  //transmitter..
  pinMode(inputPinX, INPUT);
  pinMode(inputPinY, INPUT);
}
void loop() {
  joystick[0= analogRead(inputPinSW);
  joystick[1= analogRead(inputPinX)*0.9+1000//value of ESC
  joystick[2= analogRead(inputPinY)/17+55;    //value of servo
  radio.write(&joystick, sizeof(joystick) ); 
  //Send to receiver
}
cs

Comments

Popular posts from this blog

[POE] - 패스 오브 엑자일 획득키 F 의 사용법 (Path of Exile)

[AD보드] - 맥북 패널을 모니터로 만들기 ( LP154WP4-TLA1 )

[Arduino] - HC-06를 이용해 PC 와 Arduino 블루투스 연결