Home » 산딸기 가지고 놀기 » 라즈베리파이 GPIO 활용강좌 : 라즈베리파이 위 RPino로 서보모터 제어하기

라즈베리파이 활용강좌 : 라즈베리파이 위 RPino로 서보모터 제어하기

Created Date: 2013.10.29

Modified Date: 2013.10.29

revision 1

 

이 포스트는 2013.10.29에 작성하여 적당한 테스트 없이 방치되다가 “라즈베리파이 위 Atmega328p로 서보모터 제어하기”로 변동되었습니다.

이 포스트는 Source 참고용으로 사용 될까 해서 같이 업로드 하였습니다.

 

안녕하세요 산딸기마을 팬더골드 입니다.

전의 포스트에 보면 RPino라는 참 쓸만한 녀석이 있었죠(개인적인 생각이군요).

RPino와 라즈베리파이를 사용해서 서보모터를 제어해보았습니다.

아래와 같은 다이어그램이 대충 생각납니다.

Rpi_Rpino Diagram

가능한 여러가지 조합중에 Rpi(TCP/IP, Digital) <-(Serial)->RPino(Analog, PWM) 이 가장 끌리는 조합인것 같습니다.

1. Rpino Side

① file name : “servo.ino”

main() : Servo Control with PWM

  1. #include <Servo.h>
  2. // Servo instance
  3. Servo myservoLR; //Left Right Servo
  4. Servo myservoUD; //Up Down Servo
  5. // Initial & Limit Value

int posUD = 10; // Minimum Limit on Upper

int posLR = 90; // Init Center Position

int move;

 

void setup()

{

// Serial Setup

Serial.begin(57600); // initialize serial communications at 57600 bps:

 

       // Arduino Pin No.

myservoUD.attach(2);

    myservoLR.attach(3);

 

// wait 1sec

delay(1000);

 

// move to Initial Position

myservoUD.write(posUD);

myservoLR.write(posLR);

}

 

void loop()

{

// run when Serial port Receive a byte data.

// delay time is in the control of sender, ex. raspberrypi

if(Serial.available() > 0)

{

// Read one byte from Serial Port

move = Serial.read();

// Change position Value

switch ( move )

{

case ‘<‘:

posLR–;

break;

case ‘>’:

posLR++;

break;

case ‘w’:

posUD–;

break;

case ‘s’:

posUD++;

break;

}

 

// Limit Value Control

// when value is over, set to maximum

if ( posUD<10 ) posUD = 10;

if ( posUD>150 ) posUD = 150;

if ( posLR<10 ) posLR = 10;

if ( posLR>180 ) posLR = 180;

 

// Run the motor

myservoUD.write(posUD);

myservoLR.write(posLR);

 

// wait very short time

delay(10);

}

}

 

2. Raspberry pi Side

① file name : “Servo.py”

 class : Send Character on Serial port

import serial

import time

 

class SERVO:

DEFAULT_BAUDRATE = 9600

DEFAULT_TIMEOUT = 10.0

 

DEFAULT_REPEAT = 10

 

# Initializing

def __init__(self, arg_baudrate=DEFAULT_BAUDRATE, arg_timeout=DEFAULT_TIMEOUT):

self.port = serial.Serial(“/dev/ttyAMA0”, baudrate=arg_baudrate, timeout=arg_timeout)

 

# First Set to Minimum Upper Position

for i in range(180):

  port.write(“w”)

print ‘w:%d’ % i

 

# First Set to Minimum Left Position

for i in range(180):

   port.write(“<“)

print ‘<:%d’ % i

 

# Move Up

# Can Set to repeat value, Default=10

def moveUp(self, repeat=DEFAULT_REPEAT):

for i in range(repeat):

   port.write(“w”)

print ‘w’

   time.sleep(1)

 

       # Move Down

       # Can Set to repeat value, Default=10

       def moveDown(self, repeat=DEFAULT_REPEAT):

               for i in range(repeat):

                       port.write(“s”)

print ‘s’

               time.sleep(1)

 

       # Move Left

       # Can Set to repeat value, Default=10

       def moveLeft(self, repeat=DEFAULT_REPEAT):

               for i in range(repeat):

                       port.write(“<“)

print ‘<‘

               time.sleep(1)

 

       # Move Right

       # Can Set to repeat value, Default=10

       def moveRight(self, repeat=DEFAULT_REPEAT):

               for i in range(repeat):

                       port.write(“>”)

print ‘>’

               time.sleep(1)

 

② file name : “pi_servo.py”

 main() : test function

import time

import Servo

def main():

servo = Servo.SERVO(57600, 10.0)

servo.moveUp()

servo.moveDown()

servo.moveLeft()

servo.moveRight()

if __name__ == “__main__”:

   main()

 

산딸기마을 포스트 검색

공동제작 공동프로젝트 무상후원 기관

산딸기마을 기부하기

산딸기마을 방문자 현황

Flags Countries Visits Page views
South Korea 626063 1845660
United States 10882 26091
Japan 5011 13204
Germany 2755 5151
India 1897 2902
Canada 1729 4640
United Kingdom 1596 2642
Australia 1240 2901
Russia 1219 1677
China 1077 2239
Total Pageviews: 1936700