En este tutorial veremos como controlar hasta ocho servo motores con módulos APC-220 y arduino mini pro. Armaremos el circuito, analizaremos dos códigos fuentes, tanto para el emisor como el receptor, finalmente probaremos el funcionamiento circuito.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
Placas y módulos usados en este proyecto
Arduino mini pro
El Arduino Pro Mini es una placa de microcontrolador basada en el ATmega328 .
Tiene 14 pines de entrada / salida digital (de los cuales 6 se pueden usar como salidas PWM), 6 entradas analógicas, un resonador integrado, un botón de reinicio y orificios para montar encabezados de pines. Se puede conectar un encabezado de seis pines a un cable FTDI o una placa de conexión Sparkfun para proporcionar alimentación USB y comunicación a la placa.
El Arduino Pro Mini está diseñado para su instalación semipermanente en objetos o exposiciones. La placa viene sin encabezados premontados, lo que permite el uso de varios tipos de conectores o la soldadura directa de cables. El diseño del pin es compatible con el Arduino Mini.
Hay dos versiones del Pro Mini. Uno corre a 3.3V y 8 MHz, el otro a 5V y 16 MHz.
Microcontrolador | ATmega328 * |
Fuente de alimentación de la placa | 3,35-12 V (modelo de 3,3 V) o 5-12 V (modelo de 5 V) |
Voltaje de funcionamiento del circuito | 3.3V o 5V (dependiendo del modelo) |
Pines de E / S digitales | 14 |
Pines PWM | 6 6 |
UART | 1 |
SPI | 1 |
I2C | 1 |
Pines de entrada analógica | 6 6 |
Interrupciones externas | 2 |
Corriente CC por pin de E / S | 40 mA |
Memoria flash | 32 KB de los cuales 2 KB utilizados por el gestor de arranque * |
SRAM | 2 KB * |
EEPROM | 1 KB * |
Velocidad de reloj | 8 MHz (versiones de 3.3V) o 16 MHz (versiones de 5V) |
Módulo Apc220
El módulo de datos de radio APC220 es una solución de radio de alta potencia y muy versátil, es fácil de configurar e integrar en cualquier proyecto que requiera un enlace de RF inalámbrico. Es perfecto para aplicaciones robóticas si necesita control inalámbrico. Puede conectar uno de estos Los módulos con su MCU a través de la interfaz TTL, y se conectan a su PC con otro módulo APC220 a través de un convertidor TTL / USB.
Especificación
- Frecuencia de trabajo: 420 MHz a 450 MHz
- Potencia: 3.5-5.5V
- Corriente: <25-35mA
- Temperatura de trabajo: -20 ° C ~ + 70 ° C
- Alcance: línea de visión de 1200 m (1200 bps)
- Interfaz: UART / TTL
- Velocidad de transmisión: 1200-19200 bps
- Velocidad de transmisión (aire): 1200-19200 bps
- Buffer de recepción: 256 bytes
- Tamaño: 37mm × 17 mm × 6.6mm
- Peso: 30 g
PinOut
Pin | Definicion | Detalle |
---|---|---|
1 | SET | Establecer parámetros (bajo) |
2 | AUX | Señal UART- Transmisión (baja) Transmisión (alta) |
3 | TXD | UART TX |
4 | RXD | UART RX |
5 | ES | Desactive el dispositivo cuando aplique <0,5 V. Habilite el dispositivo cuando lo deje desconectado o aplique> 1,6 V |
6 | VCC | 3.3V-5.5V de potencia |
7 | GND | Tierra 0V |
Descargar RF-Magic
Datasheet
Ejecutar APC22X_V12A.exe (RF-Magic) como administrador si su sistema no es Windows XP.
NOTA : en el software reconocerá el módulo APC220 y puerto serie COMX automáticamente una vez que la abrimos. Revisar en el Administrador de dispositivos para verificar el puerto COM correcto.
Configure RF-magic como en el marco cuadrado rojo a continuación (configuración predeterminada), y haga clic en Escribir W para escribir su configuración, luego haga clic en Leer R para leer los parámetros que ha establecido.
Configuración
Configuración de escritura y lectura
Parámetro | Rango | Predeterminado |
---|---|---|
Frecuencia de RF | Resolución 1KHz, precisión ± 100Hz | 434MHz |
Tasa RF TRx | 1200, 2400, 4800, 9600, 19200 bps | 9600bps |
Potencia de RF | 0-9 | 9 |
Tasa de serie | 1200, 2400, 4800, 9600, 19200, 38400, 57600bps | 9600bps |
ID NETO | 0-65535 (16 bits) | 12345 |
ID DE NODO | 123456789012 | |
Serie Patity | Deshabilitar, la extraña Patity, incluso Patity | Deshabilitar |
Configure el otro módulo APC220 de la misma manera, con la misma configuración de parámetros.
Modulo Relay rele de 8 canales
- Voltaje de Operación: 5V DC
- Señal de Control: TTL (3.3V o 5V)
- Nº de Relays (canales): 8 CH
- Capacidad máx: 10A/250VAC, 10A/30VDC
- Corriente máx: 10A (NO), 5A (NC)
- Tiempo de acción: 10 ms/5 ms
- Para activar salida NO: 0 Voltios
2 Jumper
16 Led de 3 mm
16 Led de 1KOhm
Pines hembras
16 Pulsadores
Pines macho
2 zócalos para arduino mini pro
8 Servos sg90
Características
- Dimensiones (L x W xH) = 22.0 x 11.5 x 27 mm (0.86 x 0.45 x 1.0 pulgadas)
- Peso: 9 gramos
- Peso con cable y conector: 10.6 gramos
- Torque a 4.8 volts: 16.7 oz/in o 1.2 kg/cm
- Voltaje de operación: 4.0 a 7.2 volts
- Velocidad de giro a 4.8 volts: 0.12 seg / 60 º
- Conector universal para la mayoría de los receptores de radio control
- Compatible con tarjetas como Arduino y microcontroladores que funcionan a 5 volts.
¿Cómo controlar un servomotor?
Puede colocar el eje del servo en varios ángulos de 0 a 180º. Los servos se controlan utilizando una señal de modulación de ancho de pulso (PWM). Esto significa que la señal PWM enviada al motor determinará la posición del eje.
PCB
Descarga el archivo gerber gratis desde aquí y mandarlo a fabricar opcionalmente–> https://www.pcbway.com/project/shareproject/Dual_Synchronized_Radio_Frequency_Control_for_Motor_Lights_and_more.html
Código Fuente Emisor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
//Variables String cadena; int pul2 = 0; int pul3 = 0; int pul4 = 0; int pul5 = 0; int pul6 = 0; int pul7 = 0; int pul8 = 0; int pul9 = 0; int estado2 = 0; int estado3 = 0; int estado4 = 0; int estado5 = 0; int estado6 = 0; int estado7 = 0; int estado8 = 0; int estado9 = 0; void setup () { Serial.begin(9600);// setea la velocidad del puerto serial debe conincidir con la del módulo apc220 //Seteamos los pines de los pulsadores como entradas y activamos resistores de pullup pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); //Seteamos los pines como salidas para activar servos en forma remota pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(A3, OUTPUT); //Activamos estas lineas si usamos módulos relay con lógica invertida (activa en con LOW y desactiva con HIGH) digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); delay(10); } void loop () { //Lectura de botones, si hemos apretados un pulsador asignamos un LOW a la variable pul2 = digitalRead(2); pul3 = digitalRead(3); pul4 = digitalRead(4); pul5 = digitalRead(5); pul6 = digitalRead(6); pul7 = digitalRead(7); pul8 = digitalRead(8); pul9 = digitalRead(9); //********************* //Enciende o apaga la luz if (pul2 == LOW) {//Si el pulsador 2 está precionado se cumple esta condición pul2 = digitalRead(2);//Leemos el estado del botón nuevamente if(estado2 ==0){//Si la variable estado2 es igual a 0 se cumple esta condición Serial.print("servo2-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(10, HIGH); estado2 =1;//Asignamos el valor 1 a la variable "estado2" } else{ Serial.print("servo2-0");//Enviamos esta cadena x el puerto serial digitalWrite(10, LOW); estado2 =0; } while(pul2 == LOW){ pul2 = digitalRead(2);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul3 == LOW) {//Si el pulsador 3 está precionado se cumple esta condición pul3 = digitalRead(3);//Leemos el estado del botón nuevamente if(estado3 ==0){//Si la variable estado3 es igual a 0 se cumple esta condición Serial.print("servo3-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(11, HIGH); estado3 =1;//Asignamos el valor 1 a la variable "estado3" } else{ Serial.print("servo3-0");//Enviamos esta cadena x el puerto serial digitalWrite(11, LOW); estado3 =0; } while(pul3 == LOW){ pul3 = digitalRead(3);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul4 == LOW) {//Si el pulsador 4 está precionado se cumple esta condición pul4 = digitalRead(4);//Leemos el estado del botón nuevamente if(estado4 ==0){//Si la variable estado4 es igual a 0 se cumple esta condición Serial.print("servo4-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(12, HIGH); estado4 =1;//Asignamos el valor 1 a la variable "estado4" } else{ Serial.print("servo4-0");//Enviamos esta cadena x el puerto serial digitalWrite(12, LOW); estado4 =0; } while(pul4 == LOW){ pul4 = digitalRead(4);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul5 == LOW) {//Si el pulsador 5 está precionado se cumple esta condición pul5 = digitalRead(5);//Leemos el estado del botón nuevamente if(estado5 ==0){//Si la variable estado5 es igual a 0 se cumple esta condición Serial.print("servo5-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(13, HIGH); estado5 =1;//Asignamos el valor 1 a la variable "estado5" } else{ Serial.print("servo5-0");//Enviamos esta cadena x el puerto serial digitalWrite(13, LOW); estado5 =0; } while(pul5 == LOW){ pul5 = digitalRead(5);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul6 == LOW) {//Si el pulsador 6 está precionado se cumple esta condición pul6 = digitalRead(6);//Leemos el estado del botón nuevamente if(estado6 ==0){//Si la variable estado6 es igual a 0 se cumple esta condición Serial.print("servo6-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(A0, HIGH); estado6 =1;//Asignamos el valor 1 a la variable "estado6" } else{ Serial.print("servo6-0");//Enviamos esta cadena x el puerto serial digitalWrite(A0, LOW); estado6 =0; } while(pul6 == LOW){ pul6 = digitalRead(6);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul7 == LOW) {//Si el pulsador 7 está precionado se cumple esta condición pul7 = digitalRead(7);//Leemos el estado del botón nuevamente if(estado7 ==0){//Si la variable estado7 es igual a 0 se cumple esta condición Serial.print("servo7-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(A1, HIGH); estado7 =1;//Asignamos el valor 1 a la variable "estado7" } else{ Serial.print("servo7-0");//Enviamos esta cadena x el puerto serial digitalWrite(A1, LOW); estado7 =0; } while(pul7 == LOW){ pul7 = digitalRead(7);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul8 == LOW) {//Si el pulsador 8 está precionado se cumple esta condición pul8 = digitalRead(8);//Leemos el estado del botón nuevamente if(estado8 ==0){//Si la variable estado8 es igual a 0 se cumple esta condición Serial.print("servo8-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(A2, HIGH); estado8 =1;//Asignamos el valor 1 a la variable "estado8" } else{ Serial.print("servo8-0");//Enviamos esta cadena x el puerto serial digitalWrite(A2, LOW); estado8 =0; } while(pul8 == LOW){ pul8 = digitalRead(8);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- //Enciende o apaga la luz if (pul9 == LOW) {//Si el pulsador 9 está precionado se cumple esta condición pul9 = digitalRead(9);//Leemos el estado del botón nuevamente if(estado9 ==0){//Si la variable estado9 es igual a 0 se cumple esta condición Serial.print("servo9-180");// Enviamos esta cadena de caracteres x el puerto serial digitalWrite(A3, HIGH); estado9 =1;//Asignamos el valor 1 a la variable "estado9" } else{ Serial.print("servo9-0");//Enviamos esta cadena x el puerto serial digitalWrite(A3, LOW); estado9 =0; } while(pul9 == LOW){ pul9 = digitalRead(9);//Se cumple esta condición mientras esté precionado el botón } } //----------------------------------------------------------------------------------- delay(50); } |
Código fuente Receptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
#include <Servo.h> Servo servoMotor1; // crear un objeto servo para controlar el servo Servo servoMotor2; // crear un objeto servo para controlar el servo Servo servoMotor3; // crear un objeto servo para controlar el servo Servo servoMotor4; // crear un objeto servo para controlar el servo Servo servoMotor5; // crear un objeto servo para controlar el servo Servo servoMotor6; // crear un objeto servo para controlar el servo Servo servoMotor7; // crear un objeto servo para controlar el servo Servo servoMotor8; // crear un objeto servo para controlar el servo String cadena; void setup () { Serial.begin(9600);// setea la velocidad del puerto serial, debe ser igual al módulo APC220 servoMotor1.attach(10); // Asignamos el pin 10 para el control del servo servoMotor1.write(0); //Posisción inicial del servo. servoMotor2.attach(11); // Asignamos el pin 11 para el control del servo servoMotor2.write(0); //Posisción inicial del servo. servoMotor3.attach(12); // Asignamos el pin 12 para el control del servo servoMotor3.write(0); //Posisción inicial del servo. servoMotor4.attach(13); // Asignamos el pin 13 para el control del servo servoMotor4.write(0); //Posisción inicial del servo. servoMotor5.attach(A0); // Asignamos el pin A0 para el control del servo servoMotor5.write(0); //Posisción inicial del servo. servoMotor6.attach(A1); // Asignamos el pin A1 para el control del servo servoMotor6.write(0); //Posisción inicial del servo. servoMotor7.attach(A2); // Asignamos el pin A2 para el control del servo servoMotor7.write(0); //Posisción inicial del servo. servoMotor8.attach(A3); // Asignamos el pin A3 para el control del servo servoMotor8.write(0); //Posisción inicial del servo. delay(10); } void loop () { //lee las cadenas que ingresan al puerto serie if (Serial.available()) { cadena = String(""); while (Serial.available()) { cadena = cadena + char(Serial.read()); delay(1); } } //-------------------------------------------------------------------- if (cadena == "servo2-180") {//compara el valor de la cadena obetinada servoMotor1.write(180); } if (cadena == "servo2-0") {//compara el valor de la cadena obetinada servoMotor1.write(0); } //-------------------------------------------------------------------- if (cadena == "servo3-180") {//compara el valor de la cadena obetinada servoMotor2.write(180); } if (cadena == "servo3-0") {//compara el valor de la cadena obetinada servoMotor2.write(0); } //-------------------------------------------------------------------- if (cadena == "servo4-180") {//compara el valor de la cadena obetinada servoMotor3.write(180); } if (cadena == "servo4-0") {//compara el valor de la cadena obetinada servoMotor3.write(0); } //-------------------------------------------------------------------- if (cadena == "servo5-180") {//compara el valor de la cadena obetinada servoMotor4.write(180); } if (cadena == "servo5-0") {//compara el valor de la cadena obetinada servoMotor4.write(0); } //-------------------------------------------------------------------- if (cadena == "servo6-180") {//compara el valor de la cadena obetinada servoMotor5.write(180); } if (cadena == "servo6-0") {//compara el valor de la cadena obetinada servoMotor5.write(0); } //-------------------------------------------------------------------- if (cadena == "servo7-180") {//compara el valor de la cadena obetinada servoMotor6.write(180); } if (cadena == "servo7-0") {//compara el valor de la cadena obetinada servoMotor6.write(0); } //-------------------------------------------------------------------- if (cadena == "servo8-180") {//compara el valor de la cadena obetinada servoMotor7.write(180); } if (cadena == "servo8-0") {//compara el valor de la cadena obetinada servoMotor7.write(0); } //-------------------------------------------------------------------- if (cadena == "servo9-180") {//compara el valor de la cadena obetinada servoMotor8.write(180); } if (cadena == "servo9-0") {//compara el valor de la cadena obetinada servoMotor8.write(0); } } |
PROYECTO RECOMENDADO