martedì 29 maggio 2012

Servo controllato via Arduino Ethernet

Questo esempio mostra come usare una Arduino Ethernet per pilotare un servo motore via Internet mediante un joystick

Sul PC sul quale e' connesso il joystick si deve lanciare il seguente programma che genera dei pacchetti UDP leggendo il valore del sensore progressivo del Joystick e convertendolo in valori tra 0 e 180 (da usare poi nel servo)
Il PC deve essere ovviamente connesso alla rete e si deve avere il file pygcurse nella directory dello script
----------------------------
import pygame
import pygcurse
import socket
from time import sleep

pygame.init()
win = pygcurse.PygcurseWindow(40, 25, 'Rov Controller')

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

j = pygame.joystick.Joystick(0)
j.init()

try:
    while True:
        pygame.event.pump()
    pot1 = int((j.get_axis(0)*90)+90)
    if (pot1 <100):
         pote1 = "0"+str(pot1)
    else:
         pote1 = str(pot1)
    win.write("Motore 1 : "+str(pote1), x=2, y=7)
    sock.sendto("M1"+str(pot1),("192.168.1.3",8888))
    sleep(0.01)
   
except KeyboardInterrupt:
    j.quit()

----------------------------

all'altro capo della rete c'e' in ascolto sulla porta UDP 8888 una Arduino Ethernet che riceve i pacchetti, estrae il valore per pilotare il servo e manda il comando al motore

----------------------------
 #include <SPI.h>         #include <Ethernet.h>
#include <Udp.h>       
#include <Servo.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,3 };

unsigned int localPort = 8888;      // local port to listen on

byte remoteIp[4];        // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

Servo m1;

void setup() {
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  m1.attach(9); // collega il motore 1 al servo 9
  Serial.begin(9600);
}

void loop() {
  int packetSize = Udp.available();

  if(packetSize)
  {
    packetSize = packetSize - 8;    

    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
    int m = atoi(&packetBuffer[1]);
    int c = atoi(&packetBuffer[2]);

    Serial.println(m);
    Serial.println(c);
    Serial.println("----------");
    m1.write(c);

  }
  delay(10);
}

----------------------------

Ed ecco lo script in azione




volendo invece di comandi progressivi si possono mandare anche comandi on/off usando i pulsanti mediante una semplice modifica del programma (in realta' usando il pulsante Mode del joystick i comandi progressivi possono essere commutati in on/off e quindi non sono necessarie modifiche al programma)



jhkhkjh