domingo, 25 de marzo de 2018

Programación Arduino

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

Programa en python para o control co botón da placa

#!/usr/bin/env python
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

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.