LusoRobótica - Robótica em Português

Robótica => Iniciantes => Tópico iniciado por: zordlyon em 22 de Fevereiro de 2011, 17:17

Título: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 17:17
Boas pessoal...Eu ja andei no nosso amigo google a procura de umas coisas relacionadas com o nunchuck e o python mas não encontrei nada que me agradasse...

Queria saber se alguém já fez alguma coisa com o nunchuck e com o arduino mas com a linguagem python?

Eu estou a desenvolver um jogo para a universidade e está a funcionar com o teclado do computador em python, e surgiu nos a ideia de controlar o "Actor" do jogo com um comando nunchuck...Agora precisamos de saber é como fazer a leitura dos eixos do nunchuck..Eu já fiz algumas brincadeiras com os motores DC e servos, mas através de programação C com o IDE do arduino...

Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: metRo_ em 22 de Fevereiro de 2011, 17:28
Se calhar começa por fazer em python um programa que comunique com o Arduino por porta serie. Em relação ao numchuck vais ter que colocar o micro a comunicar com este pois acho que não é possivel ligar ao PC directamente a menos que o uses juntamente com o Wiimote.

PC<--python/porta serie-->Arduino
Arduino<--I2C-->Numchuck

Basicamente é isto que tens que fazer! Se procurares por Arduino e Numchuck há bastantes coisas na internet assim como no forum!
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 17:43
Eu tenho um programa em processing que usa...

PC<----(usb)-----Arduino<-----(gnd/5v/pin4/5)-----Nunchuck

Queria usar +- a mesma estrutura...

e depois com a seguinte estrutura interna...

Jogo<-----Panda3d + Python<-----PC<-------- Arduino + Nunchuck

Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: xiserre em 22 de Fevereiro de 2011, 17:50
e entao que precisas? se ja usaste o nunchuck com motores dc, so tens de definir um"protocolo" para mandares os dados por porta serie pro pc... Quem diz porta serie diz usb... a imaginação e o limite
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 17:57
Sim mas como é a primeira vez que estou a lidar com o python e não sei bem a sintaxe...

Gostava de saber como comunicar...

Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: metRo_ em 22 de Fevereiro de 2011, 18:19
Sim mas como é a primeira vez que estou a lidar com o python e não sei bem a sintaxe...

Gostava de saber como comunicar...

Cumprimentos...

Pesquisas por "python serial port" ou "python arduino" têm logo o que queres :)
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 18:23
E será que posso utilizar a mesma identação do C?

ou seja o mesmo algoritmo, tipo seguir passo a passo o algoritmo que tenho em C, e "transforma-lo" em python?...

Cumprimentos..
Título: Re: Arduino + Nunchuck + Python
Enviado por: metRo_ em 22 de Fevereiro de 2011, 18:27
E será que posso utilizar a mesma identação do C?

ou seja o mesmo algoritmo, tipo seguir passo a passo o algoritmo que tenho em C, e "transforma-lo" em python?...

Cumprimentos..

No arduino tudo vai continuar em C/C++ no computador é que vais passar a ter a aplicação em python.
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 18:52
Pois andava agora a pesquisar na net...

O codigo que tenho no arduino para ler os dados do comando vai se manter certo?

agora so preciso de arranjar código em python para ler os dados do programa em C certo?


Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: metRo_ em 22 de Fevereiro de 2011, 19:30
Pois andava agora a pesquisar na net...

O codigo que tenho no arduino para ler os dados do comando vai se manter certo?

agora so preciso de arranjar código em python para ler os dados do programa em C certo?


Cumprimentos...

O que tens neste momento no Arduino vai se manter igualxinho. Basicamente o que tu tinhas antes no Processing para receber os dados do Arduino agora vais ter que fazer com python. Há exemples nos primeiro resultados da pesquisa "python arduino" até já fiquei a saber que a biblioteca de python para porta serie se chama pySerial! lol
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 19:52
Sim isso ja tinha visto, mas estava a confundir...

Pensei que o que faziamos no IDE do arduino em C, tinhamos que fazer em python...

Sendo assim julgo que deve ser mais facil...vou daqui a pouco tentar por isto a funcionar...

Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: CBX em 22 de Fevereiro de 2011, 21:27
assim por alto podes usar o arduino para enviar por serial o valor lido ou interpretado do Nunchuck e com a biblioteca pySerial lês esse valor
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 22 de Fevereiro de 2011, 23:44
Pessoal este é o codigo que tenho do lado do arduino...

Código: [Seleccione]
#include <Wire.h>;

int sensorPin = 0;    // seleciona o pin para o potenciometro
int sensorValue = 0;  // guarda o valor do sensor


void setup()
{
Serial.begin(19200);
nunchuck_setpowerpins();
nunchuck_init();
Serial.print("Nunchuck Estabilizado:\n");
}

void loop()
{
nunchuck_get_data();
nunchuck_print_data();
delay(50);
}

//

// Funçoes do Nunckuck

//

static uint8_t nunchuck_buf[6]; // array para guardar a data do nunchuck

// Uses port C (analog in) pins as power & ground for Nunchuck

static void nunchuck_setpowerpins()
{
#define pwrpin 3
#define gndpin 2

DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
}


// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it

void nunchuck_init()
{
Wire.begin(); // join i2c bus as master
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x40); // sends memory address
Wire.send(0x00); // sends sent a zero.
Wire.endTransmission(); // stop transmitting
}


// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x00); // sends one byte
Wire.endTransmission(); // stop transmitting
}


// Receive data back from the nunchuck,
// returns 1 on successful read. returns 0 on failure
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ()) {
// receive byte as an integer
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
cnt++;
}

nunchuck_send_request(); // send request for next data payload
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
return 1; // success
}
return 0; //failure
}


// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits. That is why I
// multiply them by 2 * 2

void nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;
int z_button = 0;
int c_button = 0;

// byte nunchuck_buf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]

if ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;

if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;

if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;

if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;

if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;

if ((nunchuck_buf[5] >> 6) & 1)
accel_z_axis += 2;

if ((nunchuck_buf[5] >> 7) & 1)
accel_z_axis += 1;

//Imprime o numero de vezes que ja repetiu o processo
Serial.print(i,DEC);
Serial.print("\t");

//Imprime os valores do X e Y do Joystick
Serial.print("joystick:");
Serial.print(joy_x_axis,DEC);
Serial.print(",");
Serial.print(joy_y_axis, DEC);
Serial.print(" \t");

//Imprime os valores de X, Y e Z do acelerometro
Serial.print("Movimentacao:");
Serial.print(accel_x_axis, DEC);
Serial.print(",");
Serial.print(accel_y_axis, DEC);
Serial.print(",");
Serial.print(accel_z_axis, DEC);
Serial.print("\t");

//Imprime o valor dos botoes se primido ou nao
Serial.print("botoes_activos:");
Serial.print(z_button, DEC);
Serial.print(",");
Serial.print(c_button, DEC);
Serial.print("\r\n"); // newline

i++;

  if (c_button==0){//verifica se o botao C esta pressionado ou nao, caso esteja pressionado liga os 4 LED's
//  digitalWrite(pin2, HIGH);   
  delay(100);
}
 
if(joy_y_axis<115){//Verifica o eixo dos Y se estiver menor que 115 liga o LED 2 (de baixo) 
 // digitalWrite(pin2, HIGH); 
}
  else{
  //digitalWrite(pin2,LOW);
  }
 
if(joy_y_axis>140 && joy_y_axis<255){//Verifica se o Eixo dos Y esta entre 140 e 255, caso esteja liga o LED 3(de cima)   
 // digitalWrite(pin3, HIGH); 
}
  else{
 // digitalWrite(pin3,LOW);
  }
 
if(joy_x_axis>130 && joy_x_axis<255){//verifica se o eixo dos X esta entre 130 e 255, caso esteja, liga o LED 4(da direita)   
//  digitalWrite(pin4, HIGH); 
 }
  else{
 // digitalWrite(pin4,LOW);
  }
 
  if(joy_x_axis<115){//Verifica se o eixo dos X e menor que 115, caso esteja, liga o LED 5 (da esquerda)   
 // digitalWrite(pin5, HIGH); 
  }
  else{
 // digitalWrite(pin5,LOW);
  }
 
  if(z_button==0 && accel_x_axis>135 && accel_x_axis<258){//verifica atraves do acelerometro o valor do eixo dos X e acende o led correspondente
 // digitalWrite(pin4, HIGH); 
  }
 
  if(z_button==0 && accel_x_axis<115){//verifica atraves do acelerometro o valor do eixo dos X e acende o led correspondente
  //  digitalWrite(pin5, HIGH); 
  }

  if(z_button==0 && accel_y_axis<135){//verifica atraves do acelerometro o valor do eixo dos Y e acende o led correspondente
 //   digitalWrite(pin2, HIGH); 
  }
 
  if(z_button==0 && accel_y_axis>155 && accel_y_axis<258){//verifica atraves do acelerometro o valor do eixo dos Y e acende o led correspondente
//  digitalWrite(pin3, HIGH); 
  }
   
}


// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}


// retorna o Zbutton : 1=pressionado, 0=nao pressionado
int nunchuck_zbutton()
{
 return((nunchuck_buf[5] >> 0) & 1)? 0: 1; //voodoo
}

// retorna o Cbutton: 1=pressionado, 0=nao pressionado
int nunchuck_cbutton()
{
return ((nunchuck_buf[5] >> 1) & 1) ? 0 : 1; // voodoo
}

// retorna o valor do eixo dos X do joystick
int nunchuck_joyx()
{
return nunchuck_buf[0];
}

// Retorna o valor do eixo dos Y do Joystick
int nunchuck_joyy()
{
return nunchuck_buf[1];
}

// Retorna o valor do eixo do X do acelerometro
int nunchuck_accelx()
{
return nunchuck_buf[2]; // FIXME: this leaves out 2-bits of the data
}


// Retorna o valor do eixo dos Y do acelerometro
int nunchuck_accely()
{
return nunchuck_buf[3]; // FIXME: this leaves out 2-bits of the data
}


// Retorna o valor do eixo do Z do acelerometro
int nunchuck_accelz()
{
return nunchuck_buf[4]; // FIXME: this leaves out 2-bits of the data
}

E este é o codigo que tenho do lado do python...
Código: [Seleccione]
import serial 
import time 
 
locations=['/dev/tty.usbserial-A6008muZ','/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3', 
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3']   
 
for device in locations: 
    try: 
        print "Trying...",device 
        arduino = serial.Serial(device, 19200) 
        break 
    except: 
        print "Failed to connect on",device     
 
try: 
    print arduino.readline() 
except: 
    print "Failed to send!"

Este readline tenho quase a certeza que não faz nada mas e para dar o exemplo de onde iria por o read(), a minha duvida é como é que eu vou buscar os valores do x, y e z e os botões do nunchuck através do read?...

Não estou a perceber como irei fazer read e saber quais são os valores e de que eixo...

Obrigado a todos...

Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: senso em 22 de Fevereiro de 2011, 23:58
Metes o arduino a imprimir por exemplo S,x,123,y,123,z,123,P sendo o S e o P marcadores de inicio e fim de pacote, depois apos cada coordenada tem o valor numerico do acelerometro, e podes adicionar ai o valor do joystick e dos botes, depois e fazer o parse disso no phyton e usar os valores.
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 23 de Fevereiro de 2011, 09:51
Metes o arduino a imprimir por exemplo S,x,123,y,123,z,123,P sendo o S e o P marcadores de inicio e fim de pacote, depois apos cada coordenada tem o valor numerico do acelerometro, e podes adicionar ai o valor do joystick e dos botes, depois e fazer o parse disso no phyton e usar os valores.

Boas senso, não percebi isso de por a imprimir S,x,123,y,123,z,123,P sendo o S ?

Cumprimentos...
Título: Re: Arduino + Nunchuck + Python
Enviado por: xiserre em 23 de Fevereiro de 2011, 11:22
o s e o que indica ao python o inicio da informação enviada pelo arduino.. assim que o pyhton recebe S,x,123,y,456,z,789,P, vai assumir como 123 o valor do x, 456 como y e  789 para o y. claro que podes meter dos dados de todos os botoes do nunchuck... e apenas um exemplo para o arduino comunicar com o python
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 23 de Fevereiro de 2011, 12:16
Mas como imprimo isso para poder ler do lado do python?
é assim? :
Código: [Seleccione]
void print_for_python(int x, int y) {
    Serial.print(0x00, BYTE);   
    Serial.print(x, BYTE);
    Serial.print(0x01, BYTE);
    Serial.print(y, BYTE);
}

depois no python fiz assim:
Código: [Seleccione]
import serial
import struct
ser = serial.Serial('/dev/tty.usbserial-A6008muZ')
ser.baudrate = 19200
print ser.portstr
while True:
    line = ser.read(1)
    b = struct.unpack('<B', line)[0]
    if b == 0x00:
        x = ser.read(1)
        x = struct.unpack('<B', x)[0]
        print ('X:', x)
    elif b == 0x01:
        y = ser.read(1)
        y = struct.unpack('<B', y)[0]
        print ('Y:',  y)
    else:
        print('b', b)

Bem e para avisar que ja consigo ler os dados do joystick...mas está com um bug que não estou a ter ideia do que poderá ser...

Isto e o print que me da a certo momento depois de ler os dados do joystick no python...
Código: [Seleccione]
('X:', 48)
('Y:', 54)
('b', 13)
('b', 10)
('b', 49)
('b', 9)
('b', 52)
('b', 52)
('b', 52)
('b', 9)
('b', 53)
('b', 48)
('b', 48)
('b', 9)
('b', 54)
('b', 55)
('b', 54)
('b', 9)
('b', 49)
('b', 9)
('b', 49)
('b', 9)
('X:', 143)
('Y:', 34)
('b', 13)
('b', 10)
Traceback (most recent call last):
  File "Nunchuck.py", line 7, in <module>
    line = ser.read(1)
  File "/Library/Python/2.5/site-packages/serial/serialposix.py", line 456, in read
    raise SerialException('device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)

Basicamente chega a certo momento e falha a comunicação e o que eu penso...Mas não estou a ver do que possa ser...se alguem souber agradeço...


Cumprimentos..

Título: Re: Arduino + Nunchuck + Python
Enviado por: senso em 24 de Fevereiro de 2011, 00:16
Alguma coisa se passa ai então, o baudrate é o correcto, esse /dev/tty.usbserial-A6008muZ tem um nome muito estranho.
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 24 de Fevereiro de 2011, 13:52
Sim, julgo que o baudrate seja o correcto, no terminal do arduino funciona perfeitamente...

Em relação a porta, eu tb achei estranho mas é a serial na qual o arduino se encontra ligado...fui ao menu do arduino e vi e era esta porta que estava activa...e como se pode ver no print ele de longe a longe manda me os valores de X e Y....Mas manda me muito mais vezes o do 'b'...

ou seja esta a receber coisas da serial que não são o 0x00 ou o 0x01...

Cumprimentos..
Título: Re: Arduino + Nunchuck + Python
Enviado por: senso em 24 de Fevereiro de 2011, 13:55
E ele não manda nada sem lhe metermos isso no programa, mostra ai o código todo que tens no arduino.
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 24 de Fevereiro de 2011, 20:39
Desculpa o atraso mas aqui fica o codigo que tenho no arduino...
Código: [Seleccione]

#include <Wire.h>;

int sensorPin = 0;    // seleciona o pin para o potenciometro
int sensorValue = 0;  // guarda o valor do sensor

void setup()
{
Serial.begin(19200);
nunchuck_setpowerpins();
nunchuck_init();
Serial.print("Nunchuck Estabilizado:\n");
}

void loop()
{
nunchuck_get_data();
nunchuck_print_data();
delay(50);
}

//

// Funçoes do Nunckuck

//

static uint8_t nunchuck_buf[6]; // array para guardar a data do nunchuck

// Uses port C (analog in) pins as power & ground for Nunchuck

static void nunchuck_setpowerpins()
{
#define pwrpin 3
#define gndpin 2

DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
}


// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it

void nunchuck_init()
{
Wire.begin(); // join i2c bus as master
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x40); // sends memory address
Wire.send(0x00); // sends sent a zero.
Wire.endTransmission(); // stop transmitting
}


// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x00); // sends one byte
Wire.endTransmission(); // stop transmitting
}


// Receive data back from the nunchuck,
// returns 1 on successful read. returns 0 on failure
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ()) {
// receive byte as an integer
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
cnt++;
}

nunchuck_send_request(); // send request for next data payload
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
return 1; // success
}
return 0; //failure
}


// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits. That is why I
// multiply them by 2 * 2

void nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;
int z_button = 0;
int c_button = 0;

// byte nunchuck_buf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]

if ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;

if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;

if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;

if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;

if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;

if ((nunchuck_buf[5] >> 6) & 1)
accel_z_axis += 2;

if ((nunchuck_buf[5] >> 7) & 1)
accel_z_axis += 1;

//Imprime o numero de vezes que ja repetiu o processo
Serial.print(i,DEC);
Serial.print("\t");

//Imprime os valores do X e Y do Joystick
Serial.print("joystick:");
Serial.print(joy_x_axis,DEC);
Serial.print(",");
Serial.print(joy_y_axis, DEC);
Serial.print(" \t");

//Imprime os valores de X, Y e Z do acelerometro
Serial.print("Movimentacao:");
Serial.print(accel_x_axis, DEC);
Serial.print(",");
Serial.print(accel_y_axis, DEC);
Serial.print(",");
Serial.print(accel_z_axis, DEC);
Serial.print("\t");

//Imprime o valor dos botoes se primido ou nao
Serial.print("botoes_activos:");
Serial.print(z_button, DEC);
Serial.print(",");
Serial.print(c_button, DEC);
Serial.print("\r\n"); // newline

i++;

  if (c_button==0){//verifica se o botao C esta pressionado ou nao, caso esteja pressionado liga os 4 LED's
//  digitalWrite(pin2, HIGH);   
  delay(100);
}
 
if(joy_y_axis<115){//Verifica o eixo dos Y se estiver menor que 115 liga o LED 2 (de baixo) 
 // digitalWrite(pin2, HIGH); 
}
  else{
  //digitalWrite(pin2,LOW);
  }
 
if(joy_y_axis>140 && joy_y_axis<255){//Verifica se o Eixo dos Y esta entre 140 e 255, caso esteja liga o LED 3(de cima)   
 // digitalWrite(pin3, HIGH); 
}
  else{
 // digitalWrite(pin3,LOW);
  }
 
if(joy_x_axis>130 && joy_x_axis<255){//verifica se o eixo dos X esta entre 130 e 255, caso esteja, liga o LED 4(da direita)   
//  digitalWrite(pin4, HIGH); 
 }
  else{
 // digitalWrite(pin4,LOW);
  }
 
  if(joy_x_axis<115){//Verifica se o eixo dos X e menor que 115, caso esteja, liga o LED 5 (da esquerda)   
 // digitalWrite(pin5, HIGH); 
  }
  else{
 // digitalWrite(pin5,LOW);
  }
 
  if(z_button==0 && accel_x_axis>135 && accel_x_axis<258){//verifica atraves do acelerometro o valor do eixo dos X e acende o led correspondente
 // digitalWrite(pin4, HIGH); 
  }
 
  if(z_button==0 && accel_x_axis<115){//verifica atraves do acelerometro o valor do eixo dos X e acende o led correspondente
  //  digitalWrite(pin5, HIGH); 
  }

  if(z_button==0 && accel_y_axis<135){//verifica atraves do acelerometro o valor do eixo dos Y e acende o led correspondente
 //   digitalWrite(pin2, HIGH); 
  }
 
  if(z_button==0 && accel_y_axis>155 && accel_y_axis<258){//verifica atraves do acelerometro o valor do eixo dos Y e acende o led correspondente
//  digitalWrite(pin3, HIGH); 
  }
   
}


// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}


// retorna o Zbutton : 1=pressionado, 0=nao pressionado
int nunchuck_zbutton()
{
 return((nunchuck_buf[5] >> 0) & 1)? 0: 1; //voodoo
}

// retorna o Cbutton: 1=pressionado, 0=nao pressionado
int nunchuck_cbutton()
{
return ((nunchuck_buf[5] >> 1) & 1) ? 0 : 1; // voodoo
}

// retorna o valor do eixo dos X do joystick
int nunchuck_joyx()
{
return nunchuck_buf[0];
}

// Retorna o valor do eixo dos Y do Joystick
int nunchuck_joyy()
{
return nunchuck_buf[1];
}

// Retorna o valor do eixo do X do acelerometro
int nunchuck_accelx()
{
return nunchuck_buf[2]; // FIXME: this leaves out 2-bits of the data
}


// Retorna o valor do eixo dos Y do acelerometro
int nunchuck_accely()
{
return nunchuck_buf[3]; // FIXME: this leaves out 2-bits of the data
}


// Retorna o valor do eixo do Z do acelerometro
int nunchuck_accelz()
{
return nunchuck_buf[4]; // FIXME: this leaves out 2-bits of the data
}

Cumprimentos..
Título: Re: Arduino + Nunchuck + Python
Enviado por: senso em 24 de Fevereiro de 2011, 22:10
Mas que misturada de código, quem é que fez isso?
Tem ai a mesma coisa igual 3 vezes, a tua funçao para imprimir nao está em lado nenhum e tens um monte de prints para ai perdidos, dai o python se engasgar, código indentado tambem nao há, eu nem consigo ler isso, já lhe vou dar uma limpeza..
Título: Re: Arduino + Nunchuck + Python
Enviado por: senso em 24 de Fevereiro de 2011, 22:36
Código: [Seleccione]
#include <Wire.h>;

#define pwrpin 3
#define gndpin 2

int sensorPin = 0;    // seleciona o pin para o potenciometro
int sensorValue = 0;  // guarda o valor do sensor

void setup()
{
Serial.begin(19200);
nunchuck_setpowerpins();
nunchuck_init();
}

void loop()
{
nunchuck_get_data();
nunchuck_print_data();
delay(50);
}

//

// Funçoes do Nunckuck

//

static uint8_t nunchuck_buf[6]; // array para guardar a data do nunchuck

// Uses port C (analog in) pins as power & ground for Nunchuck

static void nunchuck_setpowerpins()
{

DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= _BV(pwrpin);
}


// initialize the I2C system, join the I2C bus,
// and tell the nunchuck we're talking to it

void nunchuck_init()
{
Wire.begin(); // join i2c bus as master
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x40); // sends memory address
Wire.send(0x00); // sends sent a zero.
Wire.endTransmission(); // stop transmitting
}


// Send a request for data to the nunchuck
// was "send_zero()"
void nunchuck_send_request()
{
Wire.beginTransmission(0x52); // transmit to device 0x52
Wire.send(0x00); // sends one byte
Wire.endTransmission(); // stop transmitting
}


// Receive data back from the nunchuck,
// returns 1 on successful read. returns 0 on failure
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ()) {
// receive byte as an integer
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
cnt++;
}

nunchuck_send_request(); // send request for next data payload
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
return 1; // success
}
return 0; //failure
}


// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits. That is why I
// multiply them by 2 * 2

void nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;
int z_button = 0;
int c_button = 0;

// byte nunchuck_buf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]

if ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;

if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;

if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;

if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;

if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;

if ((nunchuck_buf[5] >> 6) & 1)
accel_z_axis += 2;

if ((nunchuck_buf[5] >> 7) & 1)
accel_z_axis += 1;

//Imprime os valores do X e Y do Joystick
Serial.print(0x00);
Serial.print(joy_x_axis,DEC);
Serial.print(0x01);
Serial.print(joy_y_axis, DEC);

}


// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}


Agora deve funcionar bem, nem sei como é que esse código alguma vez apanhava x ou y se não estava la nenhum print isolado só com x ou só com y.
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 24 de Fevereiro de 2011, 23:36
Eu agora a reparar, e eu é que me enganei no codigo...Lol. :o..

mas de qualquer maneira o anterior estava a funcionar so para o arduino, na altura arranjei-o num forum qualquer...

Uma coisa que agora a olhar para o teu e foi uma estupidez absurda minha, e agradeço te teres te dado ao trabalho de fazeres o que fizes te, é que eu tinha a fazer o print para a consola do arduino, e tinha a fazer o print para o python.... Conclusão ele misturava os prints e obvio..
A identação eu só copiei e colei aqui e não ficou com a identação ;)

Infelizmente, por burrice minha, tambem moro em Castelo de Paiva, mas estudo no Porto, e deixei o arduino e o comando no Porto, logo so poderei testar o teu codigo no domingo...

Mas agradeço te na mesma Senso...e provavelmente funcionará porque imprime somente para o python claro...
Enfim quem sabe sabe...

Obrigadão, eu domingo já coloco ca alguma coisa  ;)

Cumprimentos..
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 24 de Fevereiro de 2011, 23:43
Tenho uma pequena dúvida embora ainda não tenha testado no comando...

Os exemplos que vi usavam os prints no segundo argumento com "Byte" e o senso colocou com "Dec", supostamente será decimal...
Mas o porque disto?
Código: [Seleccione]
//Imprime os valores do X e Y do Joystick
Serial.print(0x00);
Serial.print(joy_x_axis,DEC);
Serial.print(0x01);
Serial.print(joy_y_axis, DEC);

Cumprimentos..
Título: Re: Arduino + Nunchuck + Python
Enviado por: senso em 25 de Fevereiro de 2011, 13:28
Eu usei os prints que ja la estavam, em DEC acho que ele converte para ASCII, nao sei bem, que nao uso o IDE do Arduino.
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 25 de Fevereiro de 2011, 16:00
Hum ok ok..
Obrigado mais uma vez..
 ;)
Cumprimentos..
Título: Re: Arduino + Nunchuck + Python
Enviado por: zordlyon em 27 de Fevereiro de 2011, 22:31
Caro senso queria lhe agradecer...O codigo funcionou, so tive que fazer uma pequena alteração no print...

O print necessita ficar assim...
Código: [Seleccione]
Serial.print(0x00,BYTE);
Serial.print(joy_x_axis,BYTE);
Serial.print(0x01,BYTE);
Serial.print(joy_y_axis, BYTE);

Para quem estiver interessado, aqui fica o codigo em Python e o do arduino...
Para adicionar depois os valores do acelerometro e dos botoes é a mesma coisa, basta adicionar + if's no python e + prints no codigo do arduino...