Skip to content

Instantly share code, notes, and snippets.

@taesamja
Created December 2, 2016 06:05
Show Gist options
  • Save taesamja/af7b74448c58fa1ec1311706498f422d to your computer and use it in GitHub Desktop.
Save taesamja/af7b74448c58fa1ec1311706498f422d to your computer and use it in GitHub Desktop.
//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