Arduino
O código para a programación do circuíto Arduino no IDE desenvolvémolo en C e tamén en Python. Isto permite comprender as instrucións en Python desde o programa no leguaje nativo de Arduino por analogía. Para a programación en Python utilizamos " The Python Arduino Command API".Programación en C con módulo bluetooth e aplicación móvil.
#define TRIG 10#define ECHO 9
#define PULSADOR 7
#define MOTOR 5
float tiempo1,tiempo2,tiempo;
float distancia1,distancia,velocidad;
unsigned long inicio;
int contador1;
int estado;
const int BTPWR=11;
void setup() {
pinMode(BTPWR,OUTPUT);
digitalWrite(BTPWR,HIGH);
Serial.begin(9600);
pinMode(TRIG,OUTPUT);
pinMode(ECHO,INPUT);
pinMode(PULSADOR, INPUT);
pinMode(MOTOR,OUTPUT);
}
void loop() {
iniciarTrigger();
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
Serial.print("Distancia al sensor: ");
Serial.print("|");
Serial.print(distancia);
Serial.print("|");
Serial.println(" cm");
Serial.print("|");
delay(1000);
if (Serial.available()>0)
{ estado=Serial.read();}
switch(estado)
{
case 7:
while (distancia>3.2)
{
analogWrite(MOTOR,170);
iniciarTrigger();
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
Serial.print("Distancia al sensor:");
Serial.print("|");
Serial.print(distancia);
Serial.print("|");
Serial.println(" cm");
delay(1000);
}
analogWrite(MOTOR,0);
contador1=0;
while (distancia<11.7)
{
inicio=millis()*0.001;
iniciarTrigger();
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
if (contador1==0)
{
distancia1=distancia;
tiempo1=inicio;
}
tiempo2=inicio-tiempo1;
if (tiempo2>9 and tiempo2<180){
tone(8,65.41,1000);
velocidad=(distancia-distancia1)/tiempo2;
Serial.print("Velocidad de descenso: ");
Serial.print("|");
Serial.print(velocidad);
Serial.print("|");
Serial.print(" cm/s");
Serial.print("|");
Serial.print(" Segundos: ");
Serial.print("|");
Serial.println(tiempo2);
}
delay(5000);
contador1=contador1+1;
}
estado=1;
break;
}
}
void iniciarTrigger()
{
digitalWrite(TRIG,LOW);
delayMicroseconds(5);
digitalWrite(TRIG,HIGH);
delayMicroseconds(10);
digitalWrite(TRIG,LOW);
}
Programación en C para tarballar con botón da placa.
#define TRIG 10#define ECHO 9
#define PULSADOR 7
#define MOTOR 5
float tiempo1,tiempo2,tiempo;
float distancia1,distancia2,distancia,velocidad;
unsigned long inicio,inicio_total,fin_total;
int contador1,x;
void setup() {
Serial.begin(9600);
pinMode(TRIG,OUTPUT);
pinMode(ECHO,INPUT);
pinMode(PULSADOR, INPUT);
pinMode(MOTOR,OUTPUT);
}
void loop() {
iniciarTrigger();
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
Serial.print("Distancia inicial al sensor de ultrasonidos: ");
Serial.print(distancia);
Serial.println(" cm");
delay(1000);
if (digitalRead(PULSADOR) == true)
{
Serial.println("Para iniciar un ciclo acciona el pulsador");
}
else
{
while (distancia>2.65)
{
analogWrite(MOTOR,254);
iniciarTrigger();
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
Serial.print("Distancia del nivel al sensor de ultrasonidos:");
Serial.print(distancia);
Serial.println(" cm");
}
digitalWrite(MOTOR,0);
inicio_total=millis()*0.001;
contador1=0;
while (distancia<13.2)
{
inicio=millis()*0.001;
iniciarTrigger();
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
if (contador1==0)
{
distancia1=distancia;
tiempo1=inicio;
}
tiempo2=inicio-tiempo1;
if (tiempo2>9 and tiempo2<190){
tone(8,65.41,1000);
velocidad=(distancia-distancia1)/tiempo2;
Serial.print("Velocidad de descenso: ");
Serial.print(velocidad);
Serial.print(" cm/s");
Serial.print(" Segundos transcurridos: ");
Serial.println(tiempo2);
}
delay(5000);
contador1=contador1+1;
}
fin_total=millis()*0.001;
Serial.print("Tiempo de vaciado: ");
Serial.println((-inicio_total+fin_total)/60);
}
}
void iniciarTrigger()
{
digitalWrite(TRIG,LOW);
delayMicroseconds(5);
digitalWrite(TRIG,HIGH);
delayMicroseconds(10);
digitalWrite(TRIG,LOW);
}
Configuración do módulo bluetooth HC-06
const int LED=13;const int BTVcc=11;
char nombre[10]="clepsidra";
char velocidad="4";
char pin[5]="m111";
void setup() {
pinMode(LED,OUTPUT);
pinMode(BTVcc,OUTPUT);
digitalWrite(LED,LOW);
digitalWrite(BTVcc,HIGH);
Serial.begin(9600);
Serial.print("AT");
delay(1000);
Serial.print("AT+NAME");
Serial.print(nombre);
delay(1000);
Serial.print("AT+BAUD");
Serial.print(velocidad);
delay(1000);
Serial.print("AT+PIN");
Serial.print(pin);
delay(1000);
digitalWrite(LED,HIGH);
}
void loop() {
}
Código en Python
Utilizamos " The Python Arduino Command API", a ligazón para entendela é:
https://github. com/thearn/Python-Arduino- Command-API
Na ligazón anterior descárganse os arquivos do API no botón download. Séguense logo as instrucións de instalación: ' Either run pip install arduino- python from a command line, or run python setup. py build install from the source directory to install this library'.No apartado Setup: das instrucións o máis importante é o punto: '2.Loade the prototype. ino sketch onto your Arduino board, using the Arduino IDE'. Sempre hai que cargar este sketch no IDE Arduino para que o noso programa en Python exerza o control. Recomendo ajecutar o programa en Python usando o IDE Geany. Para usar correctamente ' The Python Arduino Command API' o arquivo fundamental é arduino. py, que se atopa no cartafol Arduino, que se descarga co API.
Por exemplo, no programa para o control da clepsidra necesitamos implementar en python o que na linguaxe de Arduino haciamos así:
digitalWrite(TRIG,LOW);
delayMicroseconds(5);
digitalWrite(TRIG,HIGH);
delayMicroseconds(10);
digitalWrite(TRIG,LOW);
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
Para atopar a maneira, abrimos o arquivo arduino. py con Geany, e na liña 222 temos a solución, fariamos así para calquera outra necesidade:
def pulseIn_set(self, pin, val, numTrials=5):
"""
Sets a digital pin value, then reads the response
as a pulse width.
Useful for some ultrasonic rangefinders, etc.
inputs:
pin: pin number for pulse measurement
val: "HIGH" or "LOW". Pulse is measured
when this state is detected
numTrials: number of trials (for an average)
returns:
duration : an average of pulse length measurements
This method will automatically toggle
I/O modes on the pin and precondition the
measurment with a clean LOW/HIGH pulse.
Arduino.pulseIn_set(pin,"HIGH") is
equivalent to the Arduino sketch code:
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delayMicroseconds(2);
digitalWrite(pin, HIGH);
delayMicroseconds(5);
digitalWrite(pin, LOW);
pinMode(pin, INPUT);
long duration = pulseIn(pin, HIGH);
"""
if val == "LOW":
pin_ = -pin
else:
pin_ = pin
cmd_str = build_cmd_str("ps", (pin_,))
durations = []
for s in range(numTrials):
try:
self.sr.write(cmd_str)
self.sr.flush()
except:
pass
rd = self.sr.readline().replace("\r\n", "")
if rd.isdigit():
if (int(rd) > 1):
durations.append(int(rd))
if len(durations) > 0:
duration = int(sum(durations)) / int(len(durations))
else:
duration = None
try:
return float(duration)
except:
return -1
from Arduino import Arduino
from datetime import datetime
import numpy as np
import pylab as pl
import time
from platform import python_version
print ("Python " + python_version())
distancia=0
velocidad_graf=[]
tiempo_graf=[]
board = Arduino('9600','/dev/ttyACM0')
board.pinMode(10, "OUTPUT")
board.pinMode(9,"INPUT")
board.pinMode(7,"INPUT")
board.pinMode(5,"OUTPUT")
valor=True
while valor:
tiempo=board.pulseIn_set(9,"HIGH")
distancia=round(tiempo/58,1)
print"La distancia al sensor son: "+str(distancia)+" cm"
estado_1=board.digitalRead(7)
if estado_1 == 1:
print("Pulsa el boton de inicio del ciclo")
else:
while distancia>2.9 or distancia==-1:
board.analogWrite(5,254)
tiempo=board.pulseIn_set(9,"HIGH",5)
distancia=round(tiempo/58,1)
print"La distancia al sensor es: "+str(distancia)+" cm"
board.analogWrite(5,0)
contador=0
tiempo_inicial=0
for x in range(len(velocidad_graf)):
velocidad_graf[x]=0
tiempo_graf[x]=0
while distancia<13:
contador=contador+1
tiempo1=datetime.now()
if contador == 1:
tiempo_inicial=tiempo1
tiempo2=tiempo1-tiempo_inicial
print "El tiempo transcurrido son: "+str(tiempo2.seconds)+"segundos"
tiempo=board.pulseIn_set(9,"HIGH",5)
distancia=tiempo/58
if tiempo2.seconds==0:
distancia1=distancia
if tiempo2.seconds>10 and tiempo2.seconds<180:
distancia2=distancia
velocidad1=round((distancia2-distancia1)/(tiempo2.seconds),2)
velocidad_graf.append(velocidad1)
tiempo_graf.append(tiempo2.seconds)
longitud_lista=len(velocidad_graf)
board.Melody(8,["C4"],[4])
print "La velocidad de descenso del nivel es:"+str(velocidad1)+" cm/s"
pl.title("Velocidad de descenso")
pl.xlabel("Tiempo")
pl.ylabel("Velocidad(cm/s)")
pl.plot(tiempo_graf, velocidad_graf, "r")
pl.show()
valor=False
digitalWrite(TRIG,LOW);
delayMicroseconds(5);
digitalWrite(TRIG,HIGH);
delayMicroseconds(10);
digitalWrite(TRIG,LOW);
tiempo=pulseIn(ECHO,HIGH);
distancia=(tiempo/58);
Para atopar a maneira, abrimos o arquivo arduino. py con Geany, e na liña 222 temos a solución, fariamos así para calquera outra necesidade:
def pulseIn_set(self, pin, val, numTrials=5):
"""
Sets a digital pin value, then reads the response
as a pulse width.
Useful for some ultrasonic rangefinders, etc.
inputs:
pin: pin number for pulse measurement
val: "HIGH" or "LOW". Pulse is measured
when this state is detected
numTrials: number of trials (for an average)
returns:
duration : an average of pulse length measurements
This method will automatically toggle
I/O modes on the pin and precondition the
measurment with a clean LOW/HIGH pulse.
Arduino.pulseIn_set(pin,"HIGH") is
equivalent to the Arduino sketch code:
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delayMicroseconds(2);
digitalWrite(pin, HIGH);
delayMicroseconds(5);
digitalWrite(pin, LOW);
pinMode(pin, INPUT);
long duration = pulseIn(pin, HIGH);
"""
if val == "LOW":
pin_ = -pin
else:
pin_ = pin
cmd_str = build_cmd_str("ps", (pin_,))
durations = []
for s in range(numTrials):
try:
self.sr.write(cmd_str)
self.sr.flush()
except:
pass
rd = self.sr.readline().replace("\r\n", "")
if rd.isdigit():
if (int(rd) > 1):
durations.append(int(rd))
if len(durations) > 0:
duration = int(sum(durations)) / int(len(durations))
else:
duration = None
try:
return float(duration)
except:
return -1
Programa en python para o control co botón da placa
#!/usr/bin/env pythonfrom Arduino import Arduino
from datetime import datetime
import numpy as np
import pylab as pl
import time
from platform import python_version
print ("Python " + python_version())
distancia=0
velocidad_graf=[]
tiempo_graf=[]
board = Arduino('9600','/dev/ttyACM0')
board.pinMode(10, "OUTPUT")
board.pinMode(9,"INPUT")
board.pinMode(7,"INPUT")
board.pinMode(5,"OUTPUT")
valor=True
while valor:
tiempo=board.pulseIn_set(9,"HIGH")
distancia=round(tiempo/58,1)
print"La distancia al sensor son: "+str(distancia)+" cm"
estado_1=board.digitalRead(7)
if estado_1 == 1:
print("Pulsa el boton de inicio del ciclo")
else:
while distancia>2.9 or distancia==-1:
board.analogWrite(5,254)
tiempo=board.pulseIn_set(9,"HIGH",5)
distancia=round(tiempo/58,1)
print"La distancia al sensor es: "+str(distancia)+" cm"
board.analogWrite(5,0)
contador=0
tiempo_inicial=0
for x in range(len(velocidad_graf)):
velocidad_graf[x]=0
tiempo_graf[x]=0
while distancia<13:
contador=contador+1
tiempo1=datetime.now()
if contador == 1:
tiempo_inicial=tiempo1
tiempo2=tiempo1-tiempo_inicial
print "El tiempo transcurrido son: "+str(tiempo2.seconds)+"segundos"
tiempo=board.pulseIn_set(9,"HIGH",5)
distancia=tiempo/58
if tiempo2.seconds==0:
distancia1=distancia
if tiempo2.seconds>10 and tiempo2.seconds<180:
distancia2=distancia
velocidad1=round((distancia2-distancia1)/(tiempo2.seconds),2)
velocidad_graf.append(velocidad1)
tiempo_graf.append(tiempo2.seconds)
longitud_lista=len(velocidad_graf)
board.Melody(8,["C4"],[4])
print "La velocidad de descenso del nivel es:"+str(velocidad1)+" cm/s"
pl.title("Velocidad de descenso")
pl.xlabel("Tiempo")
pl.ylabel("Velocidad(cm/s)")
pl.plot(tiempo_graf, velocidad_graf, "r")
pl.show()
valor=False
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.