Go Down

Topic: Arduino+Proceesing+Ardumoto (Read 779 times) previous topic - next topic

Snyp

Mar 20, 2010, 02:37 am Last Edit: Mar 20, 2010, 02:38 am by snyp Reason: 1
Bonjours a tous, je me présente je m'appel james et j'ai 21 ans ^^.
Voila j'aimerais pouvoir piloter mon robot via processing.
J'aimerais d'abord le piloter par usb,puis par la suite avec une liaison xbee.
Mais je ne trouve pas de code et étant amateur dans la programmation  :'( .
Donc voici mon code que j'ai trouver chez sparfun pour commander les moteur via le terminal

Code: [Select]
#define PwmPinMotorA 10
#define PwmPinMotorB 11
#define DirectionPinMotorA 12
#define DirectionPinMotorB 13
#define SerialSpeed 9600
#define BufferLength 16
#define LineEnd '#'

char inputBuffer[BufferLength];

void setup()
{
 // motor pins must be outputs
 pinMode(PwmPinMotorA, OUTPUT);
 pinMode(PwmPinMotorB, OUTPUT);
 pinMode(DirectionPinMotorA, OUTPUT);
 pinMode(DirectionPinMotorB, OUTPUT);

 Serial.begin(SerialSpeed);
}

// process a command string
void HandleCommand(char* input, int length)
{
 Serial.println(input);
 if (length < 2) { // not a valid command
   return;
 }
 int value = 0;
 // calculate number following command
 if (length > 2) {
   value = atoi(&input[2]);
 }
 int* command = (int*)input;
 // check commands
 // note that the two bytes are swapped, ie 'RA' means command AR
 switch(*command) {
   case 'FA':
     // motor A forwards
     analogWrite(PwmPinMotorA, value);
     digitalWrite(DirectionPinMotorA, HIGH);
     break;
   case 'RA':
     // motor A reverse
     analogWrite(PwmPinMotorA, value);
     digitalWrite(DirectionPinMotorA, LOW);
     break;
   case 'FB':
     // motor B forwards
     analogWrite(PwmPinMotorB, value);
     digitalWrite(DirectionPinMotorB, LOW);
     break;
   case 'RB':
     // motor B reverse
     analogWrite(PwmPinMotorB, value);
     digitalWrite(DirectionPinMotorB, HIGH);
     break;
   default:
     break;
 }  
}

void loop()
{
 // get a command string form the serial port
 int inputLength = 0;
 do {
   while (!Serial.available()); // wait for input
   inputBuffer[inputLength] = Serial.read(); // read it in
 } while (inputBuffer[inputLength] != LineEnd && ++inputLength < BufferLength);
 inputBuffer[inputLength] = 0; //  add null terminator
 HandleCommand(inputBuffer, inputLength);
}


Je suis prêt a apprendre (lentement mais surrement  :D )

Snyp

Bon j'ai bien avancer j'arrive à controler mes moteur en appuyant sur une touche demandé mais quand je relache la touche mes moteurs tourne toujours  :o

Voici les codes:

//Processing
import processing.serial.*;      
Serial port;  
String portname = "COM3";

void setup()
{
 size(120, 120);
 port = new Serial(this, portname, 9600);
}

void draw()
{
 background(0.0);
}

void keyPressed()

{

 if (key == 'z' || key == 'Z')
 {
   port.write('z');
 }
 else if (key == 's' || key == 'S')
 {
   port.write('s');
 }
 else if (key == 'd' || key == 'D')
 {
   port.write('d');
 }
 else if (key == 'q' || key == 'Q')
 {
   port.write('q');
 }
}


//Arduino

#define PwmPinMotorA 10
#define PwmPinMotorB 11
#define DirectionPinMotorA 12
#define DirectionPinMotorB 13
#define SerialSpeed 9600
#define BufferLength 16
#define LineEnd '#'

char touche;


void setup()
{
 // motor pins must be outputs
 pinMode(PwmPinMotorA, OUTPUT);
 pinMode(PwmPinMotorB, OUTPUT);
 pinMode(DirectionPinMotorA, OUTPUT);
 pinMode(DirectionPinMotorB, OUTPUT);

 Serial.begin(SerialSpeed);
}

void loop(void)
{
 char val = Serial.read();
 {
   switch(val)
   {

   case 'z'://avancer
     analogWrite(PwmPinMotorA, 50);
     digitalWrite(DirectionPinMotorA, LOW);
     analogWrite(PwmPinMotorB, 50);
     digitalWrite(DirectionPinMotorB, HIGH);
     break;

   case 's'://reculer
     analogWrite(PwmPinMotorA, 50);
     digitalWrite(DirectionPinMotorA, HIGH);
     analogWrite(PwmPinMotorB, 50);
     digitalWrite(DirectionPinMotorB, LOW);
     break;
   }
 }
}






Snyp

Toujours personne pour m'aider?  ::)

ekaki

Tu as déjà avancé -.^
En fait, il ne s'arrête jamais car il n'y a pas de ré-initialisation des conditions, c'est juste; "en cas de.. fait ça..."
Il faudrait plutôt utiliser une boucle conditionnelle avec écouteur comme on peut le voir dans cet exemple :
Code: [Select]
void loop()
{
 // get a command string form the serial port
 int inputLength = 0;
 do {
   while (!Serial.available()); // wait for input
   inputBuffer[inputLength] = Serial.read(); // read it in
 } while (inputBuffer[inputLength] != LineEnd && ++inputLength < BufferLength);
 inputBuffer[inputLength] = 0; //  add null terminator
 HandleCommand(inputBuffer, inputLength);
}

-> http://www.projectallusion.com/1/post/2009/11/iphone-controlled-solar-powered-arduino-tank.html

Du reste, sur cette page il y a déjà tout ce qu'il faut pour faire ce que tu veux -.^

Go Up