domingo, 27 de febrero de 2011

Ejemplo 3: Servo

.



En este ejemplo, veremos cómo controlar un servo enviando la posición a través del bus CAN.
En el Arduino 1, está conectado un potenciómetro, el cual servirá para indicar la posición del servo, el cual está conectado en el Arduino 2.
Para ello, se adquiere la señal analógica, se usa la función map() para cambiarla al rango 0-180 grados, y se envía usando el primer byte del mensaje cuya ID=0x100.
El Arduino 2 se encuentra monitorizando el bus, y en cuanto se recibe el mensaje con dicha ID, recoge la nueva posición del byte 0, y actualiza el servo.



(click para ampliar)

Véamos el código, el cual gracias a la libreria CAN es casi inmediato:

ARDUINO 1 - Potenciómetro


// ----------------------------------------------
// SECUDUINO
// http://secuduino.blogspot.com/
// By Igor Real
// 27/Feb/2011
// SERVO CONTROL
// ---------------------------------------------- 

#include <CAN.h>
#include <Servo.h>

Servo myServo;
int pos = 0; 

void setup()
{
  Serial.begin(115200);
  Serial.println("Empezamos...");
  CAN.begin(1); 
  //Using one pin to supply the potenciometer.
  pinMode(7,OUTPUT);
  digitalWrite(7,HIGH);
}

void loop()
{
  
    int val = analogRead(0);
    pos = map(val, 0, 1023, 0, 180);
    Serial.println(pos,DEC);
                          
    CAN_TxMsg.id=0x100;    
    CAN_TxMsg.header.rtr=0;
    CAN_TxMsg.header.length=8;
    CAN_TxMsg.data[0]=pos;
    CAN_TxMsg.data[1]=0x00;
    CAN_TxMsg.data[2]=0x00; 
    CAN_TxMsg.data[3]=0x00;
    CAN_TxMsg.data[4]=0x00;
    CAN_TxMsg.data[5]=0x00;
    CAN_TxMsg.data[6]=0x00;
    CAN_TxMsg.data[7]=0x00;
  
    CAN.send(&CAN_TxMsg); 

}


ARDUINO 2 - Servo


// ----------------------------------------------
// SECUDUINO
// http://secuduino.blogspot.com/
// By Igor Real
// 27/Feb/2011
// SERVO CONTROL
// ---------------------------------------------- 

#include <CAN.h>
#include <Servo.h>

Servo myServo;

void setup()
{
  Serial.begin(115200);
  Serial.println("Empezamos...");
  CAN.begin(1); 
  myServo.attach(9);
}

void loop()
{
  

  if (CAN.CheckNew())
  {
    
    CAN.ReadFromDevice(&CAN_RxMsg); 
    
    //Print message via Serial Port
    Serial.print(CAN_RxMsg.id,HEX);
    Serial.print(" => ");
    Serial.print(CAN_RxMsg.data[0],HEX); 
    Serial.print(" - ");
    Serial.print(CAN_RxMsg.data[1],HEX); 
    Serial.print(" - ");
    Serial.print(CAN_RxMsg.data[2],HEX); 
    Serial.print(" - ");
    Serial.print(CAN_RxMsg.data[3],HEX); 
    Serial.print(" - ");
    Serial.print(CAN_RxMsg.data[4],HEX); 
    Serial.print(" - ");
    Serial.print(CAN_RxMsg.data[5],HEX); 
    Serial.print(" - ");
    Serial.print(CAN_RxMsg.data[6],HEX); 
    Serial.print(" - ");
    Serial.println(CAN_RxMsg.data[7],HEX); 
    
    //ID=100, Byte 0 => Servo target position
    if (CAN_RxMsg.id=0x100)
    {
      myServo.write(CAN_RxMsg.data[0]);    
    }
  }

}



Y ahora el video para ver el resultado final:






No hay comentarios:

Publicar un comentario