He diseñado la caja mediante Autodesk 123D y la he impreso con mi impresora 3D.
Componentes:
- Arduino Leonardo
- Altavoz
- Grabador-reproductor de un sonido
- Sensor de distancia
- Tarjeta inhalámbrica RFID
- LCD Nokia
- piezzo-buzzer
- sensor temperatura
- teclado
Proyectos con Arduino, Raspberry Pi, móviles, programación...
Top Code recocido y recuadrado por la aplicación |
//Prueba de comunicación entre Arduino y un teléfono Android con una aplicación hecha con AppInventor
// Tomado de http://www.instructables.com/id/How-control-arduino-board-using-an-android-phone-a/
// la conexión física de la tarjeta bluetooth con el arduino la he tomado de:
// http://www.instructables.com/id/Cheap-2-Way-Bluetooth-Connection-Between-Arduino-a/?ALLSTEPS
// y de http://www.instructables.com/id/Androino-Talk-with-an-Arduino-from-your-Android-d/?ALLSTEPS
// Versión v1: Mediante botones en el teléfono controlo el coche
// Versión v2: Añado control por movimiento del teléfono sin necesidad de pulsar botones
// Versión v3: Añado sensor de distancia
// IMPORTANTE: Para evitar el error avrdude: stk500_getsync(): not in sync: resp=0x00 cuando se sube el programa al arduino hay que
// DISCONNECT ANY WIRES going to pin 0 (RX) while you do the upload. The sketch upload function uses the RX pin.
#include
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
const uint8_t SPEED_INCREMENT = 50;
byte serialA;
uint8_t speed = 255;
uint8_t distanceStatus=1; //1 Far, 2 Middle, 3 Near
//uint8_t oldDistanceStatus=1;
//uint8_t greenDistance=100;
int yellowDistance=250;
int redDistance=530;
int distanceSensorPin = A0;
int distanceSensorValue;
int read1, read2, read3, readMedia, readDiference1, readDiference2, readDiference3;
const int TOLERABLE_READ_ERROR = 30;
void setup()
{
// initialize the serial communication:
Serial.begin(9600); //baud rate - make sure it matches that of the module you got:
motor1.run(RELEASE);
motor2.run(RELEASE);
}
void loop() {
if (Serial.available() > 0) {
serialA = Serial.read();
// Serial.println(serialA);
processCommand(serialA);
}
processDistance();
}
void processCommand(byte command){
switch (command) {
case 1:
// Serial.println("********Recived 1 *******");
left();
break;
case 2:
// Serial.println("********Recived 2 *******");
right();
break;
case 3:
// Serial.println("********Recived 3 *******");
forward();
break;
case 4:
// Serial.println("********Recived 4 *******");
backward();
break;
case 5:
// Serial.println("********Recived 5 *******");
fullStop();
break;
case 6:
// Serial.println("********Recived 6 *******");
increaseSpeed();
break;
case 7:
// Serial.println("********Recived 7 *******");
decreaseSpeed();
break;
default:
// Serial.print("********Recived unexpected command: ") + Serial.println(command);
break;
}
}
void right(){
// Serial.println("Turning right...");
motor1.run(FORWARD);
motor1.setSpeed(speed);
motor2.run(RELEASE);
}
void left(){
// Serial.println("Turning left...");
motor2.run(FORWARD);
motor2.setSpeed(speed);
motor1.run(RELEASE);
}
void forward(){
// Serial.println("Forward...");
motor1.run(FORWARD);
motor2.run(FORWARD);
motor1.setSpeed(speed);
motor2.setSpeed(speed);
}
void backward(){
// Serial.println("Backward...");
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor1.setSpeed(speed);
motor2.setSpeed(speed);
}
void fullStop(){
// Serial.println("FullStop...");
motor1.run(RELEASE);
motor2.run(RELEASE);
}
void increaseSpeed(){
// Serial.println("IncreaseSpeed...");
if ((speed + SPEED_INCREMENT) > 255){
speed = 255;
}else{
speed += SPEED_INCREMENT;
}
motor1.setSpeed(speed);
motor2.setSpeed(speed);
}
void decreaseSpeed(){
// Serial.println("DecreaseSpeed...");
if ((speed - SPEED_INCREMENT) < 0){
speed = 0;
}else{
speed -= SPEED_INCREMENT;
}
motor1.setSpeed(speed);
motor2.setSpeed(speed);
}
void processDistance(){
// read the value from the sensor:
distanceSensorValue = readDistance();
// Serial.print("distanceSensorValue=");
// Serial.println(distanceSensorValue);
// Serial.print("distanceStatus=");
// Serial.println(distanceStatus);
if (distanceSensorValue == 999){
//error in read
return;
}
if (distanceSensorValue < yellowDistance && distanceStatus != 1){
// Serial.println("distanceStatus_1");
distanceStatus=1;
Serial.print("1"); //Sending to phone
}else if (distanceSensorValue >= yellowDistance && distanceSensorValue < redDistance && distanceStatus != 2){
// Serial.println("distanceStatus_2");
distanceStatus=2;
Serial.print("2"); //Sending to phone
}else if (distanceSensorValue >= redDistance && distanceStatus != 3){
// Serial.println("distanceStatus_3");
distanceStatus=3;
Serial.print("3"); //Sending to phone
fullStop();
}
}
// return media of to 3 reads or 999 if there is error
int readDistance(){
read1=analogRead(distanceSensorPin);
delay(50); //delay between readings to avoid errors because of erratic reading
read2=analogRead(distanceSensorPin);
delay(50); //delay between readings to avoid errors because of erratic reading
read3=analogRead(distanceSensorPin);
delay(50);
readMedia = (read1 + read2 + read3)/3;
//we need to use readDiferenceX variables due to abs() limitations (read Reference Documentation)
readDiference1 = read1 - readMedia;
readDiference2 = read2 - readMedia;
readDiference3 = read3 - readMedia;
if ((abs(readDiference1) > TOLERABLE_READ_ERROR) || (abs(readDiference2) > TOLERABLE_READ_ERROR) || (abs(readDiference2) > TOLERABLE_READ_ERROR)){
// the 3 reads have too many differences
return 999;
}
return (read1 + read2 + read3)/3; //media of the 3 reads
}
svn checkout http://trekduino.googlecode.com/svn/trunk/ trekduino-read-only
https://code.google.com/p/trekduino/source/browse/
https://code.google.com/p/trekduino/
/*
* CocheNunchukV2 Coche con ArduinoNunchuk y motores Lego
* Mediante un nunchuk conectado mediante el cable puedo manejar un coche hecho con dos motores Lego
* En el Nunchuk he configurado lo siguiente:
* - botón de parada
* - botón de arranque
* - girandole sobre el eje X giro a derecha o izquierda
* - levantándole o bajándole sobre el eje Y se regula la velocidad
* - con el joystick que lleva integrado controlo la marcha atrás
*
* Copyleft 2011 Antonio Garcia Figueras
*
* Usando libreria de Gabriel Bianconi, http://www.gabrielbianconi.com/projects/arduinonunchuk/
*
*/
#include <Wire.h>
#include "ArduinoNunchuk.h"
#include <AFMotor.h>
#define BAUDRATE 19200
#define PORCENTAJE_MARGENX 20
#define PORCENTAJE_MARGENY 20
ArduinoNunchuk nunchuk = ArduinoNunchuk();
//Servo myservo;
int minX;
int maxX;
int minY;
int maxY;
int minZ;
int maxZ;
float centroX;
float margenX;
int contador;
float razonY;
int posXServo;
boolean swStop;
int velocidad;
AF_DCMotor motorIz(1, MOTOR12_64KHZ); // create motor izquierda, 64KHz pwm
AF_DCMotor motorDe(2, MOTOR12_64KHZ); // create motor derecha, 64KHz pwm
void setup() {
Serial.begin(BAUDRATE);
pinMode(13, OUTPUT); //Iniciamos el led
Serial.println("Inicio incializacion");
nunchuk.init();
Serial.println("Final incializacion");
calibraAccel();
// Averiguamos cual es el valor del punto medio
centroX = (float)(minX + (maxX -minX)/2);
Serial.print("centroX:");
Serial.println(centroX, DEC);
// Daremos este margen desde el centro para considerar que va recto
margenX = (float)PORCENTAJE_MARGENX * (maxX -minX)/100;
Serial.print("margenX:");
Serial.println(margenX, DEC);
//Calculo de la razon para calcular el valor del velocidad (70-255=185)
//en funcion del movimiento del nunchucku en el eje Y
razonY = (float)185/(maxX - minX);
Serial.print("RazonY:");
Serial.println(razonY, DEC);
swStop = true;
}
void loop() {
nunchuk.update();
imprimeValoresNunchuk();
// delay(2000);
if (nunchuk.zButton==1){
swStop=true;
}else if (nunchuk.cButton==1){
swStop=false;
}
if (swStop){
para();
Serial.println("swStop es true");
}else{
determinaMovimiento();
Serial.println("swStop es false");
}
// Serial.println("***************************************");
// Serial.print("accelX:");
// Serial.println(nunchuk.accelX, DEC);
}
void parpadea(){
for (int cont = 0; cont < 3; cont++){
digitalWrite(13, HIGH); // set the LED on
delay(500); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(500);
}
}
void determinaVelocidad(){
// Al multiplicar la posicion Y del nunckuk por la razon
// lo convertimos a valores entre 70 y 255 para la velocidad del motor
velocidad = (int)((nunchuk.accelY - (maxY - minY)) * razonY)+70;
motorIz.setSpeed(velocidad);
motorDe.setSpeed(velocidad);
Serial.print("accelY:");
Serial.println(nunchuk.accelY, DEC);
Serial.print("Velocidad");
Serial.println(velocidad, DEC);
}
void determinaMovimiento(){
determinaVelocidad();
if (nunchuk.accelX > (centroX + margenX)){
giroDerecha();
}else if(nunchuk.accelX < (centroX - margenX)){
giroIzquierda();
}else{
recto();
}
}
void giroDerecha(){
Serial.print("giroDerecha");
motorDe.run(RELEASE);
if (nunchuk.analogY < 100){
motorIz.run(BACKWARD);
}else{
motorIz.run(FORWARD);
}
}
void giroIzquierda(){
Serial.print("giroIzquierda");
motorIz.run(RELEASE);
if (nunchuk.analogY < 100){
motorDe.run(BACKWARD);
}else{
motorDe.run(FORWARD);
}
}
void recto(){
Serial.print("recto");
if (nunchuk.analogY < 100){
motorIz.run(BACKWARD);
motorDe.run(BACKWARD);
}else{
motorIz.run(FORWARD);
motorDe.run(FORWARD);
}
}
void para(){
motorIz.run(RELEASE);
motorDe.run(RELEASE);
}
// Calibra todos los acelerometros para saber sus
// valores minimos y maximos
void calibraAccel() {
parpadea(); // parpadea cuando va a comenzar la calibración
nunchuk.update();
minX = nunchuk.accelX;
maxX = nunchuk.accelX;
minY = nunchuk.accelY;
maxY = nunchuk.accelY;
minZ = nunchuk.accelZ;
maxZ = nunchuk.accelZ;
contador=0;
Serial.println("Inicio calibracion");
while (contador<=200){
Serial.print("Paso=");
Serial.println(contador);
nunchuk.update();
if (nunchuk.accelX < minX){
minX=nunchuk.accelX;
}
if (nunchuk.accelX > maxX){
maxX=nunchuk.accelX;
}
if (nunchuk.accelY < minY){
minY=nunchuk.accelY;
}
if (nunchuk.accelY > maxY){
maxY=nunchuk.accelY;
}
if (nunchuk.accelZ < minZ){
minX=nunchuk.accelZ;
}
if (nunchuk.accelZ > maxZ){
maxZ=nunchuk.accelZ;
}
delay(10);
contador++;
}
Serial.print("Resultado calibracion X. MinX=");
Serial.print(minX, DEC);
Serial.print(" MaxX=");
Serial.print(maxX, DEC);
Serial.print(" Diferencia=");
Serial.println(maxX - minX);
Serial.print("Resultado calibracion Y. MinY=");
Serial.print(minY, DEC);
Serial.print(" MaxY=");
Serial.print(maxY, DEC);
Serial.print(" Diferencia=");
Serial.println(maxY - minY);
Serial.print("Resultado calibracion Z. MinZ=");
Serial.print(minZ, DEC);
Serial.print(" MaxZ=");
Serial.print(maxZ, DEC);
Serial.print(" Diferencia=");
Serial.println(maxZ - minZ);
parpadea();// parpadea al finalizar la calibración
}
void imprimeValoresNunchuk(){
Serial.print(nunchuk.analogX, DEC);
Serial.print(' ');
Serial.print(nunchuk.analogY, DEC);
Serial.print(' ');
Serial.print(nunchuk.accelX, DEC);
Serial.print(' ');
Serial.print(nunchuk.accelY, DEC);
Serial.print(' ');
Serial.print(nunchuk.accelZ, DEC);
Serial.print(' ');
Serial.print(nunchuk.zButton, DEC);
Serial.print(' ');
Serial.println(nunchuk.cButton, DEC);
}