collapse

* Links de Robótica

* Posts Recentes

Procuro resistências 220 Ohm de 1% por brunus
[Hoje às 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[Hoje às 11:19]


Printer 3D barata por almamater
[Hoje às 09:27]


Videos hipnoticos de mecanica industrial por TigPT
[Hoje às 00:07]


FPV Drone Racing? por brunus
[Hoje às 00:00]


Decodificar cabo por Hugu
[Ontem às 23:11]


Ajuda para replicar e reparar um Dimmer por brunus
[30 de Novembro de 2016, 23:23]


Adaptar impressora 3D a Drill Maschine por Hugu
[30 de Novembro de 2016, 23:20]


Módulo gsm por dio123
[30 de Novembro de 2016, 13:39]


RAM SO-DIMM 256 MB por Hugu
[29 de Novembro de 2016, 22:52]

Autor Tópico: Arduino + Nunchuck + Python  (Lida 3577 vezes)

0 Membros e 2 Visitantes estão a ver este tópico.

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Arduino + Nunchuck + Python
« 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...

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.705
Re: Arduino + Nunchuck + Python
« Responder #1 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!

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #2 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...

Offline xiserre

  • Mini Robot
  • *
  • Mensagens: 277
Re: Arduino + Nunchuck + Python
« Responder #3 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

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #4 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...

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.705
Re: Arduino + Nunchuck + Python
« Responder #5 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 :)

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #6 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..

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.705
Re: Arduino + Nunchuck + Python
« Responder #7 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.

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #8 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...

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.705
Re: Arduino + Nunchuck + Python
« Responder #9 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

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #10 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...

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Arduino + Nunchuck + Python
« Responder #11 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

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #12 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...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.988
  • Helpdesk do sitio
Re: Arduino + Nunchuck + Python
« Responder #13 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.
Avr fanboy

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.668
Re: Arduino + Nunchuck + Python
« Responder #14 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...