collapse

* Posts Recentes

Formatação de Arduinos (Uno, Nuovemila, Diecimila) por jm_araujo
[Hoje às 12:42]


Como ver se uma tomada tem a terra ligada? por LVirtual
[Hoje às 11:29]


VS-Solar Challenge 2018 por TigPT
[Ontem às 16:43]


Via Verde - Identificador por TigPT
[17 de Fevereiro de 2018, 09:56]


Estação de soldadura da Banggood, será boa compra ? por vasco
[16 de Fevereiro de 2018, 17:47]


Desenho PCBs 80's por senso
[16 de Fevereiro de 2018, 14:35]


Como guardar componentes SMD ? por vasco
[16 de Fevereiro de 2018, 14:34]


e-bike converter piscas para 12v por vasco
[15 de Fevereiro de 2018, 23:51]


Ebay - fornecedor em Espanha por SerraCabo
[15 de Fevereiro de 2018, 01:11]


BostonDynamics - Vai uma mãozinha? por TigPT
[14 de Fevereiro de 2018, 15:58]

Autor Tópico: Ler serial através do Python  (Lida 1670 vezes)

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

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 333
Ler serial através do Python
« em: 05 de Julho de 2012, 00:16 »
Boa noite.
Venho mais uma vez pedir ajuda.

Tenho o seguinte sketch de exemplo no arduino (2009)
Código: [Seleccione]
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.0);
  Serial.println(voltage);
}

quando executo este script Python
Código: [Seleccione]
import time
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.setDTR(False)
arduino=ser.read()
while 1:
  time.sleep(5)
  ser.flush()
  print "LDR:",ord(arduino)
o valor é constante, independentemente da quantidade de luz que incide no LDR, se fechar o idle e abrir o serial monitor do arduino o valor varia consoante a luz incidente.

O circuito é o mais básico para ler um LDR:
1 perna da resistência no ground, 1perna do ldr no vcc e a leitura é feita entre o ldr e a resistência através do pino analog 0.

Agradeço qualquer dica.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.729
Re: Ler serial através do Python
« Responder #1 em: 05 de Julho de 2012, 00:27 »
Nunca usei python mas diria que ali dentro do while deverias fazer um read, do que conheço da palavra flush, esta apenas te esvazia a memória, mas sem fazeres o read não sei se garantes que o valor vá parar à memória.

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 333
Re: Ler serial através do Python
« Responder #2 em: 05 de Julho de 2012, 22:31 »
Alterei o script python para
Código: [Seleccione]
import time
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.setDTR(False)
while 1:
  time.sleep(1.5)
  print "%.2f" % (ord(ser.read())*5.0/1023.0)
e o sketch do arduino para
Código: [Seleccione]
void setup()
{
  Serial.begin(9600);
}
void loop()
{
Serial.print(analogRead(0));
}

Quando executo o script python no Idle (em ubuntu 12.04 64 bits) vejo valores semelhantes aos que obtenho no serial monitor do arduino, quando ligo o arduino na USB do Raspberry PI (Model B) e executo o script o único valor que aparece é 0. Alguém tem ideia do que poderá estar a acontecer? No raspberry até já tentei correr o script como root.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.459
  • Helpdesk do sitio
Re: Ler serial através do Python
« Responder #3 em: 05 de Julho de 2012, 22:48 »
Falta de drivers?
Faz lsusb, depois liga o arduino e volta a fazer o mesmo, e depois de ligares o arduino corre tambem o dmesg para ver se ele está a ser correctamente detectado, talvez seja falta de corrente para alimentar o Arduino..
Avr fanboy

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 333
Re: Ler serial através do Python
« Responder #4 em: 06 de Julho de 2012, 01:36 »
amanhã vou tentar com php... aqui no portátil já fiz uns forms simples em php e a coisa funciona... seguem em anexo os scripts que fiz mais uma classe para aceder a portas série em PHP

O sketch no arduino é o seguinte:
Código: [Seleccione]
int pinLed = 13;
int pinldr=0;
void setup()
{
  pinMode(pinLed, OUTPUT);
  pinMode(pinldr,INPUT);
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0)
  {
    if(Serial.read()=='1')
    {
      digitalWrite(pinLed,HIGH);
      Serial.print(analogRead(pinldr));
    }
    else
    {
      digitalWrite(pinLed,LOW);
      Serial.print(analogRead(pinldr));
    }
  }
}
« Última modificação: 06 de Julho de 2012, 01:39 por poliveira1978 »