Created
December 2, 2016 06:05
-
-
Save taesamja/af7b74448c58fa1ec1311706498f422d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//2016.11.25 | |
// servo와 pwm 충돌문제를 해결하기 위해 핀배치 변경 | |
#include <Servo.h> | |
#include <SoftwareSerial.h> | |
#define servoUDPin 9 | |
#define servoLRPin 10 | |
#define dir1PinA 8 | |
#define dir2PinA 7 | |
#define dir1PinB 12 | |
#define dir2PinB 11 | |
#define speedPinA 3 | |
#define speedPinB 5 | |
#define MOVE 1 | |
#define STOP 0 | |
Servo servoUP, servoLR; // 카메라 틸팅 | |
SoftwareSerial mySerial(4, 2); // RX, TX | |
byte State; //동작 상태 STOP, MOVE | |
void setup() | |
{ | |
Serial.begin(9600); | |
Serial.println("Start UART test"); // PC의 시리얼 모니터에 표시합니다. | |
mySerial.begin(9600); //소프트 시리얼로 라즈베리 파이와 통신하게 됩니다. | |
pinMode(dir1PinA, OUTPUT); | |
pinMode(dir2PinA, OUTPUT); | |
pinMode(dir1PinB, OUTPUT); | |
pinMode(dir2PinB, OUTPUT); | |
//pinMode(speedPinA, OUTPUT); // PWM은 디지털 출력으로 설정하지 않는다. | |
//pinMode(speedPinB, OUTPUT); | |
digitalWrite(dir1PinA, LOW); | |
digitalWrite(dir2PinA, LOW); | |
digitalWrite(dir1PinB, LOW); | |
digitalWrite(dir2PinB, LOW); | |
//analogWrite(speedPinA, 200); | |
//analogWrite(speedPinB, 200); | |
//servo와 pwm의 충동 문제 | |
// servo 사용시 pwm 9,10번 사용불가 (11도 동작하지 않음) | |
// servo motor 설정 및 초기값 | |
servoUP.attach(servoUDPin); | |
servoUP.write(90); //각도./ | |
servoLR.attach(servoLRPin); | |
servoLR.write(90); | |
State = STOP; // DC모터 초기상태 : 정지 | |
} | |
void loop() | |
{ | |
byte incomingByte; | |
int num; | |
// 직렬통신을 이용하여 라즈베리파이로 부터 명령어 수신 | |
// 명령어 파라메터 | |
// dc 모터 : F, B, L, R, S | |
// servo 모터 : U(위아래), T(좌우) -- 라즈베리파이, 앱 수정 필요 // 일단 'Z'로 좌우 테스트 | |
if (mySerial.available() > 0) | |
{ | |
incomingByte = mySerial.read(); | |
num = mySerial.parseInt(); | |
mySerial.print("incoming ");mySerial.println(incomingByte); | |
mySerial.print("num ");mySerial.println(num); | |
//dc움직임 : F, B, L, R, S (전진, 후진, 좌회전, 우회전, 정지) | |
//dc_motor(incomingByte, num); -- | |
switch(incomingByte) | |
{ | |
case 'F' : //전진 | |
//State = MOVE; | |
dc_motor_f(num); | |
break; | |
case 'B' : //후진 | |
//State = MOVE; | |
dc_motor_b(num); | |
break; | |
case 'L' : //좌회전 | |
//State = MOVE; | |
dc_motor_l(num); | |
break; | |
case 'R' : //우회전 | |
//State = MOVE; | |
dc_motor_r(num); | |
break; | |
case 'S' : //정지 | |
//State = STOP; | |
dc_motor_stop(); | |
break; | |
case 'Z' : // 카메라 좌우 | |
//servo_motor(180-num); | |
servoLR.write(180-num); | |
break; | |
case 'U' : // 카메라 Up | |
//servo_motor(90); | |
servoUP.write(45); | |
break; | |
case 'D' : // 카메라 Down | |
//servo_motor(120); | |
servoUP.write(90); | |
break; | |
case 'Y' : // 고속 | |
case 'X' : // 저속 | |
if(State == MOVE) // 정지상태가 아니면 | |
{ | |
analogWrite(speedPinA, num); | |
analogWrite(speedPinB, num); | |
} | |
break; | |
} | |
} | |
} | |
void servo_motor(int angle) { | |
//서보모터 회전 | |
servoLR.write(angle); | |
} | |
void dc_motor_f(int num) // 전진 | |
{ | |
State = MOVE; | |
digitalWrite(dir1PinA, HIGH); | |
digitalWrite(dir2PinA, LOW); | |
digitalWrite(dir1PinB, HIGH); | |
digitalWrite(dir2PinB, LOW); | |
analogWrite(speedPinA, num); | |
analogWrite(speedPinB, num); | |
} | |
void dc_motor_b(int num) // 후진 | |
{ | |
State = MOVE; | |
digitalWrite(dir1PinA, LOW); | |
digitalWrite(dir2PinA, HIGH); | |
digitalWrite(dir1PinB, LOW); | |
digitalWrite(dir2PinB, HIGH); | |
analogWrite(speedPinA, num); | |
analogWrite(speedPinB, num); | |
} | |
void dc_motor_r(int num) // 좌회전 | |
{ | |
State = MOVE; | |
digitalWrite(dir1PinA, LOW); | |
digitalWrite(dir2PinA, HIGH); // | |
digitalWrite(dir1PinB, HIGH); | |
digitalWrite(dir2PinB, LOW); | |
analogWrite(speedPinA, num); | |
analogWrite(speedPinB, num); | |
// 좌우 회전은 0.25초 동안만 회전하고 멈춤 | |
// 인터넷으로 명령을 내릴 경우 지연시간 때문에 원하는 각도만큼 회전하기 어려움 | |
delay(250); | |
dc_motor_stop(); | |
} | |
void dc_motor_l(int num) // 우회전 | |
{ | |
State = MOVE; | |
digitalWrite(dir1PinA, HIGH); | |
digitalWrite(dir2PinA, LOW); | |
digitalWrite(dir1PinB, LOW); | |
digitalWrite(dir2PinB, HIGH); // | |
analogWrite(speedPinA, num); | |
analogWrite(speedPinB, num); | |
// 좌우 회전은 0.25초 동안만 회전하고 멈춤 | |
// 인터넷으로 명령을 내릴 경우 지연시간 때문에 원하는 각도만큼 회전하기 어려움 | |
delay(250); | |
dc_motor_stop(); | |
} | |
void dc_motor_stop() // 정지 | |
{ | |
State = STOP; | |
digitalWrite(dir1PinA, LOW); | |
digitalWrite(dir2PinA, LOW); | |
digitalWrite(dir1PinB, LOW); | |
digitalWrite(dir2PinB, LOW); | |
analogWrite(speedPinA, 0); | |
analogWrite(speedPinB, 0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment