Juguete controlado por Android con Raspberry Motor Shield
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
| ||||
| ||||
|
Acerca de este proyecto
Al final del proyecto, gestionaremos un vehículo todoterreno controlado por el sensor de acelerador del dispositivo Android
El proyecto contiene dispositivos Motor shield, raspberry pi, arduino y dc motors.
PASO 1
En primer lugar deberíamos hacer un bus I2C entre raspberry pi y arduino. Puede ver por qué elegimos I2C desde aquí.
Puede encontrar el código requerido que contiene tanto I2C como el proceso de protección del motor como se muestra a continuación.
#include #define MyAddress 0x40 # include AF_DCMotor motorhiz (3); AF_DCMotor motoryon (4); byte DataToBeSend [1]; byte ReceivedData; int contador =0; void setup () {Serial.begin (9600 ); / * Inicializar el esclavo I2C y asignar la función de devolución de llamada 'onReceive' en 'I2CReceived' * / Wire.begin (MyAddress); Wire.onReceive (I2CReceived); Wire.onRequest (I2CRequest); motorhiz.setSpeed (254); motorhiz.run (LIBERACIÓN); motoryon.setSpeed (254); motoryon.run (RELEASE);} void loop () {/ * Incrementar DataToBeSend cada segundo y asegurarse de que oscile entre 0 y 99 * / // DataToBeSend [0] =(DataToBeSend [0]> =99)? 0:DataToBeSend [0] + 1;} / * Esta función se llamará automáticamente cuando RPi2 envíe datos a este esclavo I2C * / void I2CReceived (int NumberOfBytes) {// contador ++; // Cadena contadorStr =Cadena (contador); //Serial.println("ReceivedData:"+ counterStr); / * WinIoT ha enviado bytes de datos; leerlo * / ReceivedData =Wire.read (); int ReceivedDataInt =(int) ReceivedData; String ReceivedDataStr =String (ReceivedData); Serial.println (ReceivedDataInt); if (ReceivedDataInt> =100) // X Datası {Serial.println ("DataX:" + ReceivedDataStr); if (ReceivedDataInt> 145 &&ReceivedDataInt <154) {Serial.println ("LIBERAR"); motorhiz.run (LIBERACIÓN); } else if (ReceivedDataInt> =100 &&ReceivedDataInt <104) {Serial.println ("LIBERAR"); motorhiz.run (LIBERACIÓN); } else if (ReceivedDataInt> =155) {ReceivedDataInt =ReceivedDataInt -155; int motorSpeed =(ReceivedDataInt * 10) +50; if (motorSpeed> 254) {motorSpeed =254; } motorhiz.setSpeed (motorSpeed); motorhiz.run (HACIA ATRÁS); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); } else if (ReceivedDataInt> =105) {ReceivedDataInt =ReceivedDataInt -105; int motorSpeed =(ReceivedDataInt * 10) +50; if (motorSpeed> 254) {motorSpeed =254; } motorhiz.setSpeed (motorSpeed); motorhiz.run (ADELANTE); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); }} else // Y Datası {Serial.println ("DataX:" + ReceivedDataStr); if (ReceivedDataInt> 45 &&ReceivedDataInt <54) {Serial.println ("LIBERAR"); motoryon.run (LIBERACIÓN); } else if (ReceivedDataInt> =0 &&ReceivedDataInt <4) {Serial.println ("LIBERAR"); motoryon.run (LIBERACIÓN); } else if (ReceivedDataInt> =55) {ReceivedDataInt =ReceivedDataInt -55; int motorSpeed =(ReceivedDataInt * 12) +50; if (motorSpeed> 254) {motorSpeed =254; } motoryon.setSpeed (motorSpeed); motoryon.run (HACIA ATRÁS); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); } else if (ReceivedDataInt> =5) {ReceivedDataInt =ReceivedDataInt -5; int motorSpeed =(ReceivedDataInt * 12) +50; if (motorSpeed> 254) {motorSpeed =254; } motoryon.setSpeed (motorSpeed); motoryon.run (ADELANTE); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); }}} / * Esta función se llamará automáticamente cuando RPi2 solicite datos de este esclavo I2C * / void I2CRequest () {// Serial.println ("DataToBeSend"); / * Enviar datos a WinIoT * / //Wire.write(DataToBeSend,1);}
Esquema de pines de I2C para la comunicación entre arduino y raspberry pi en la imagen como se muestra arriba. No es necesario utilizar una fuente de alimentación externa para arduino. Arduino obtendrá energía del pin Vout de raspberry pi.
PASO 2
El código requerido para raspberry pi (que funciona como servidor web) que envía datos a arduino a través de I2C como se muestra a continuación.
El código podría encontrar los códigos al final de la página (sección de códigos).
PASO 3
Desarrollamos la aplicación para Android Visual Studio Cordova que envía los datos del sensor del acelerómetro al servidor web mediante solicitudes ajax.
El código podría encontrar los códigos al final de la página (sección de códigos).
BREVEMENTE
1-) La aplicación de Android envía datos del sensor (datos del acelerómetro del teléfono Android) al servidor web que se ejecuta en raspberry pi.
2-) El servidor web envía datos (raspberry pi obtiene datos del sensor acelerómetro del teléfono Android) a arduino usando I2C.
3-) Arduino procesa los datos y ejecuta los motores utilizando protectores de motores.
Código
- Wiri.h I2C Comminication y código de Android moto shield
- Mando a distancia de Android
- Servidor web Windows IOT
Wiri.h I2C Comminication y código de android moto shield Arduino
Comunicación I2C entre arduino y código arduino raspberry pi. Es para comunicación en serie para dos dispositivos con una fuente de salida de entrada mínima.#include#define MyAddress 0x40 # include AF_DCMotor motorhiz (3); AF_DCMotor motoryon (4); byte DataToBeSend [ 1]; byte ReceivedData; int contador =0; void setup () {Serial.begin (9600); / * Inicializar el esclavo I2C y asignar la función de devolución de llamada 'onReceive' en 'I2CReceived' * / Wire.begin (MyAddress); Wire.onReceive (I2CReceived); Wire.onRequest (I2CRequest); motorhiz.setSpeed (254); motorhiz.run (LIBERACIÓN); motoryon.setSpeed (254); motoryon.run (RELEASE);} void loop () {/ * Incrementar DataToBeSend cada segundo y asegurarse de que oscile entre 0 y 99 * / // DataToBeSend [0] =(DataToBeSend [0]> =99)? 0:DataToBeSend [0] + 1;} / * Esta función se llamará automáticamente cuando RPi2 envíe datos a este esclavo I2C * / void I2CReceived (int NumberOfBytes) {// contador ++; // Cadena contadorStr =Cadena (contador); //Serial.println("ReceivedData:"+ counterStr); / * WinIoT ha enviado bytes de datos; leerlo * / ReceivedData =Wire.read (); int ReceivedDataInt =(int) ReceivedData; String ReceivedDataStr =String (ReceivedData); Serial.println (ReceivedDataInt); if (ReceivedDataInt> =100) // X Datası {Serial.println ("DataX:" + ReceivedDataStr); if (ReceivedDataInt> 145 &&ReceivedDataInt <154) {Serial.println ("LIBERAR"); motorhiz.run (LIBERACIÓN); } else if (ReceivedDataInt> =100 &&ReceivedDataInt <104) {Serial.println ("LIBERAR"); motorhiz.run (LIBERACIÓN); } else if (ReceivedDataInt> =155) {ReceivedDataInt =ReceivedDataInt -155; int motorSpeed =(ReceivedDataInt * 10) +50; if (motorSpeed> 254) {motorSpeed =254; } motorhiz.setSpeed (motorSpeed); motorhiz.run (HACIA ATRÁS); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); } else if (ReceivedDataInt> =105) {ReceivedDataInt =ReceivedDataInt -105; int motorSpeed =(ReceivedDataInt * 10) +50; if (motorSpeed> 254) {motorSpeed =254; } motorhiz.setSpeed (motorSpeed); motorhiz.run (ADELANTE); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); }} else // Y Datası {Serial.println ("DataX:" + ReceivedDataStr); if (ReceivedDataInt> 45 &&ReceivedDataInt <54) {Serial.println ("LIBERAR"); motoryon.run (LIBERACIÓN); } else if (ReceivedDataInt> =0 &&ReceivedDataInt <4) {Serial.println ("LIBERAR"); motoryon.run (LIBERACIÓN); } else if (ReceivedDataInt> =55) {ReceivedDataInt =ReceivedDataInt -55; int motorSpeed =(ReceivedDataInt * 12) +50; if (motorSpeed> 254) {motorSpeed =254; } motoryon.setSpeed (motorSpeed); motoryon.run (HACIA ATRÁS); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); } else if (ReceivedDataInt> =5) {ReceivedDataInt =ReceivedDataInt -5; int motorSpeed =(ReceivedDataInt * 12) +50; if (motorSpeed> 254) {motorSpeed =254; } motoryon.setSpeed (motorSpeed); motoryon.run (ADELANTE); String motorSpeedStr =String (motorSpeed); Serial.println ("MotorHiz:" + motorSpeedStr); }}} / * Esta función se llamará automáticamente cuando RPi2 solicite datos de este esclavo I2C * / void I2CRequest () {//Serial.println("DataToBeSend "); / * Enviar datos a WinIoT * / //Wire.write(DataToBeSend,1);}
Mando a distancia de Android C #
Mando a distancia de AndroidSin vista previa (solo descarga).
Servidor web Windows IOT C #
Windows IOT Web ServerSin vista previa (solo descarga).
Piezas y carcasas personalizadas
Diagrama de pines de Arduino a frambuesaEsquemas
para más detalles:https://www.hackster.io/AnuragVasanwala/home-automation-0dcefcProceso de manufactura
- Sensor de movimiento con Raspberry Pi
- Robot que usa Raspberry Pi y Bridge Shield
- Robot Raspberry Pi controlado por Bluetooth
- Cree su robot de transmisión de video controlado por Internet con Arduino y Raspberry Pi
- Robot controlado por gestos con Raspberry Pi
- ROBOT WIFI DE FRAMBUESA PI CONTROLADO DESDE EL TELÉFONO INTELIGENTE DE ANDROID
- Robot controlado por Wifi usando Raspberry Pi
- Sistema de robótica de detección humana con Arduino Uno
- Arduino Spybot
- Control remoto universal usando Arduino, 1Sheeld y Android
- LED controlados por Alexa a través de Raspberry Pi