collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

0 Membros e 1 Visitante estão a ver este tópico.

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
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...
Cumprimentos,
André Carvalho.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
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.768
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...
Cumprimentos,
André Carvalho.

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.768
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...
Cumprimentos,
André Carvalho.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
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.768
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..
Cumprimentos,
André Carvalho.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
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.768
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...
Cumprimentos,
André Carvalho.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
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.768
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...
Cumprimentos,
André Carvalho.

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.768
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...
Cumprimentos,
André Carvalho.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • 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.768
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...
Cumprimentos,
André Carvalho.