====== mBot Ranger co IDE de arduino ======
{{ :guias:mbot:mbot_ranger.jpg?400 |mbot_ranger.jpg}}
**traballo en progreso**
====== mBot Ranger co IDE de arduino ======
O mBot Ranger conta cunha completa librería de funcións ([[https://github.com/Makeblock-official/Makeblock-Libraries/archive/master.zip|https://github.com/Makeblock-official/Makeblock-Libraries/archive/master.zip]]) que permite programalo directamente desde o IDE de arduino.
Con todo, a sintaxe resulta un pouco confusa para quen está a dar os primeiros pasos na programación co IDE de arduino (e para moitos que xa levan moito andado). O obxectivo deste artigo é facilitar os recursos para que o alumnado e o profesorado poidan programar a placa Auriga do mBot Ranger ao máis puro estilo arduino.
===== Instalación do Driver de comunicación co computador =====
Hai moitas referencias de problemas co chip de comunicación CH340g que trae a placa Auriga que ven co Ranger. Pero para iso non temos alternativa, xa que é o chip de comunicacións que vén soldado na placa. A forma máis fácil de instalar o controlador é a que vos indicamos a continuación, usando o mesmo programa mBlock.
Pero se tes problemas, ou prefires probar a instalar a última versión, que nalgúns casos funciona mellor, unha boa idea para empezar é buscar na internet //**"driver CH340g"**// e o nome do voso sistema operativo. Podes atopar moitas páxinas como esta [[http://www.prometec.net/ch340g]] que poden ser de axuda. Por se tes tentacións de ir directamente á páxina do fabricante [[http://www.wch.cn/product/ch340.html]], que sería o máis lóxico, adiantámosche que está exclusivamente en chinés.
Se prefires empezar polo máis fácil, abonda con que no programa mBlock seleccións no menú **Conectar > Instalar Driver de arduino**. É moi posible que as primeiras veces que te conectes teñas problemas que poden ir desde que o punteiro do rato quede conxelado por un tempo, ata que o computador se reinície bruscamente. É importante que te asegures de ter o teu traballo gardado antes de conectar o ordenador á placa. Máis adiante mellora un pouco. A verdade é que este driver non vai moi fino.
Debes ter en conta que cando abriches o Ranger por primeira vez, a placa Auriga trae cargado un programa que inclúe varias funcións para poder usala co mBlock, ou conectar por Bluetooth. Cando subas un novo programa desde o IDE de arduino ese programa substitúese polo que estás a subir, e perdes esas funcións. Sempre podes recuperar as funcións que viñan de fábrica volvendo cargar o programa orixinal no menú **Conectar > Actualizar Firmware**
====== A primeira librería ======
O primeiro nun robot é lograr que se mova. A solución máis sinxela que se nos ocorre é usar a librería mobilerobot que é parte do conxunto de librerías para accionamiento de motores con arduino que podedes descargar en https://github.com/brico-labs/ArduinoDCmotorDrivers.
Para instalar esta librería e as outras que iremos necesitando o primeiro é descargala e descomprimirla. A librería que nos interesa é **mobilerobot**, e para instalala, o que tedes que facer é copiar o cartafol **mobilerobot** ao cartafol **arduino>libraríes**
{{ :guias:mbot:descarga_libreria_github.png?700 |}}
Para comprobar se a librería está ben instalada podedes entrar no programa arduino, o IDE de arduino (se xa o tiñades aberto é necesario saír e volver entrar cada vez que instaledes novas librerías). Logo, no menú **Arquivo > Exemplos > mobilerobot > mBotRanger_Arduino > mBotRanger_Arduino** podedes abrir o exemplo para mBot.
{{ :guias:mbot:ejemplo_mbot.png?800 |}}
Lembrade que se queredes modificar e gardar o exemplo deberedes gardar unha copia (Gardar como?).
====== Movémonos ======
No exemplo que temes a continuación poderes ver como se pode crear un obxecto do tipo Robot que sexa compatible co Ranger, e como usar as catro funciones que acabamos de incluír:
* **fordward (velocidade_L, velocidade_R, tempo_avance)**: fai avanzar o mBot durante o //**tempo_avance**// indicado (en mili segundos) coas velocidades //**velocidade_L**// e //**velocidade_R**// nas rodas esquerda e dereita. O valor debe estar entre 0 e 255.
* **reverse (velocidade_L, velocidade_R, tempo_avance)**: para que o Ranger retroceda. Os parámetros son os mesmos que na función anterior.
* **rotate (tempo_xiro)**: O Ranger vira sobre se mesmo durante o //**tempo de xiro**// indicado (en mili segundos). Se //**tempo_xiro**// é positivo, o xiro é cara á dereita. Se é negativo cara á esquerda.
* **brake (tempo_freo)**: Frea o robot durante o tempo indicado (en mili segundos)
Un exemplo de uso podería ser:
#include
RobotMovil robot(46,47,10,49,48,11);
void setup() {}
void loop()
{
robot.forward(175,175,1000);
robot.reverse(120,120,2000);
robot.rotate(1000);
robot.rotate(-1000);
robot.brake(1000);
}
A mesma librería serve para controlar calquera robot que construades cun arduino e un driver dos tipos que se usan máis habitualmente para pequenos motores (L293, L298 e TB6612). No cartafol de exemplos da librería están os esquemas de como montar cada un deles e ligazóns a algúns proxectos abertos de robots.
====== ======
====== Explorando o mundo ======
O Ranger vén equipado cunha tarxeta chamada Auriga que inclúe varios sensores. Aos nosos efectos é como unha tarxeta arduino MEGA 2560. Os sensores están conectados con pines analóxicos do microprocesador, polo que se poden ler coa instrución **analogRead (número_de_pin)** [[http://www.arduino.org/learning/reference/analogread|http://www.arduino.org/learning/reference/analogread]]. O valor de saída variará entre 0 e 1023.
* **Sensor de luz esquerdo**... A3 analogRead(A3)
* **Sensor de luz dereito**....... A2 analogRead(A2)
* **Sensor de temperatura**.... A0 analogRead(A0)
* **Sensor de son**................ A1 analogRead(A1).
Os sensores de luz dan un valor maior canto maior sexa a cantidade de luz que reciben, ainda que non se corresponden con ningunha unidade de medida de iluminación.
O sensor de temperatura é unha NTC (resistencia con coeficiente de temperatura negativa) que ten un comportamento exponencial. Sen entrar en máis detalles, a continuación redes un código de exemplo para ler o valor da temperatura. Se quereres facer algunha lectura, podedes copiar a fórmula que está dentro da sección //**loop**//.
Este e outros tipo de sensores de temperatura teñen un comportamento bo cando se trata de medir variacións de temperatura, pero poden darnos o valor con ata un par de graos de máis ou de menos que o valor real. Eso pode facer que varias placas den valores de temperatura distintos incluso nas mismas condicións.
int PIN_temperatura = A0;
float temperatura;
void setup()
{
// Abre a comunicación serie (para o monitor serie)
Serial.begin (9600);
}
void loop()
{
// Le o valor da tensión no pin A0
float v_temperatura = analogRead (PIN_temperatura);
// Calcula o valor da temperatura
temperatura = 1.0 / (log(v_temperatura/(1023-v_temperatura)) / 3375.0 + 1/298.15) - 273.15;
Serial.print ("Temperatura: "); Serial.println (temperatura);
delay (500);
}
No sensor de son, a saída do micrófono integrado está conectada directamente á entrada analóxica **A1**, polo que mide o valor instantáneo da onda de son, e non a súa amplitude. Un bo truco para conseguir un valor proporcional á intensidade do ruído ambiente é realizar varias medidas seguidas e quedar co máximo. Neste exemplo tomamos 100 medidas, que parecen moitas, pero levan moi pouco tempo.
int PIN_sonido = A1;
int intensidad_sonido;
void setup()
{
// Abre a comunicación serie (para o monitor serie)
Serial.begin (9600);
}
void loop()
{
intensidad_sonido = 0;
for (int i=0; i<100; i++)
{
// Le o valor da tensión no pin A1 e queda co máximo das medidas tomadas
intensidad_sonido = max (intensidad_sonido, analogRead (PIN_sonido));
}
Serial.print ("Intensidad de sonido: "); Serial.println (intensidad_sonido);
delay (500);
}
====== Facendo ruído ======
No **pin 45** temos un zumbador que responde perfectamente ás instrución **tone** [[http://www.arduino.org/learning/reference/tone|http://www.arduino.org/learning/reference/tone]] e **noTone** [[http://www.arduino.org/learning/reference/notone|http://www.arduino.org/learning/reference/notone]]
Un exemplo que seguro vos soará:
int zoador = 45;
void setup()
{
tone (zoador, 392); delay (600); noTone (zoador); delay (10);
tone (zoador, 392); delay (600); noTone (zoador); delay (10);
tone (zoador, 392); delay (600); noTone (zoador); delay (10);
tone (zoador, 311); delay (450); noTone (zoador); delay (10);
tone (zoador, 466); delay (150); noTone (zoador); delay (10);
tone (zoador, 392); delay (600); noTone (zoador); delay (10);
tone (zoador, 311); delay (450); noTone (zoador); delay (10);
tone (zoador, 466); delay (150); noTone (zoador); delay (10);
tone (zoador, 392); delay (600); noTone (zoador); delay (10);
delay (600);
tone (zoador, 588); delay (600); noTone (zoador); delay (10);
tone (zoador, 588); delay (600); noTone (zoador); delay (10);
tone (zoador, 588); delay (600); noTone (zoador); delay (10);
tone (zoador, 622); delay (450); noTone (zoador); delay (10);
tone (zoador, 466); delay (150); noTone (zoador); delay (10);
tone (zoador, 370); delay (600); noTone (zoador); delay (10);
tone (zoador, 294); delay (450); noTone (zoador); delay (10);
tone (zoador, 466); delay (150); noTone (zoador); delay (10);
tone (zoador, 392); delay (1200); noTone (zoador); delay (10);
noTone (zoador);
}
void loop() {}
====== Conectando sensores externos ======
A tarxeta de control do Auriga do mBot ten 5 portos dedicados á conexión co mundo exterior. Son os que están sinalados do 6 ao 10 e coas catro cores branco, amarelo, azul e gris escuro. Cada un dos portos ten alimentación a 5V e está conectado con dúas entradas analóxicas do arduino MEGA2560. Tamén permiten conectar dispositivos I2C. As entradas analóxicas de cada un dos portos son as seguintes:
* **PORTO 06** A10 e A15
* **PORTO 07** A9 e A14
* **PORTO 08** A8 e A13
* **PORTO 09** A7 e A12
* **PORTO 10** A6 e A11
====== ======
====== Sensor SEGUE-LINEAS ======
{{ :guias:mbot:sigue_lineas.png?100}} Ten dúas barreiras ópticas reflexivas para detectar se o chan é branco ou negro. A saída é dixital (todo ou nada), xa que teñen un comparador e un indicador luminoso para cada canle. Cando se reflicte a luz no chan (zona branca ou clara) o indicador azul xunto ao sensor acéndese e a saída pasa a nivel alto. Cando non se reflicte a luz (o chan está lonxe) ou o chan é suficientemente escuro (estamos sobre a liña negra), o indicador apágase e a saída pasa a nivel baixo. Non podemos axustar a sensibilidade.
O valor de saída pódese ler coa instrución **digitalRead (número_de_pin)** [[http://www.arduino.org/learning/reference/digitalread|http://www.arduino.org/learning/reference/digitalread]].
Por exemplo, se o sensor está conectado no PORTO 09:
* **Valor do sensor esquerdo** .. digitalRead(A7)
* **Valor do sensor dereito ** ..... digitalRead(A12)
Este é o código para un segue-líñas básico:
#include
RobotMovil robot(46,47,10,49,48,11);
bool linea_dcha; // Esta variable será certa cando o sensor dereito está sobre a liña
bool linea_izqda; // Esta variable será certa cando o sensor esquerdo está sobre a liña
void setup() {
pinMode (A7, INPUT); // Son as entradas asociadas co PORTO 9
pinMode (A12, INPUT); // Son as entradas asociadas co PORTO 9
}
void loop() {
linea_dcha = ! digitalRead (A7);
linea_izqda = ! digitalRead (A12);
// Os dous sensores están sobre a liña
if ( linea_dcha && linea_izqda) robot.forward(135,135,10);
// O sensor dereito saíuse da liña
else if (! linea_dcha && linea_izqda) robot.rotate( 10);
// O sensor esquerdo saíuse da liña
else if ( linea_dcha && ! linea_izqda) robot.rotate(-10);
// Falta programar o que pasa cando os dous sensores saen la liña
}
====== ======
====== Sensor de ULTRASONS ======
{{ :guias:mbot:ultrasonidos.png?100}} Para este sensor o máis conveniente é usar a librería NewPing que podemos descargar en [[https://bitbucket.org/teckel12/arduino-new-ping/downloads/|https://bitbucket.org/teckel12/arduino-new-ping/downloads/]]. Desta forma poderemos usar a mesma librería nos arduinos co moi popular e barato sensor de ultrasonidos **SR04**. Temos unha completa explicación do uso desta librería en [[http://playground.arduino.cc/Code/NewPing|http://playground.arduino.cc/Code/NewPing]]
{{ :guias:mbot:ejemplo_newping.png?600 }}
Unha vez instalada podemos ver un exemplo de como funciona en **Arquivo>Exemplos>NewPing>NewPingExample** No exemplo temos que substituír os valores **TRIGGER_PIN** e **ECHO_PIN**, en función do PORTO no que teñamos enchufado o sensor. No noso caso TRIGGER_PIN e ECHO_PIN sempre serán iguais. Por exemplo, se o sensor está conectado no PORTO 10:
**#define TRIGGER_PIN A11**
**#define ECHO_PIN A11**
====== Luces ======
Pendente:
==== O LED do blink está demasiado escondido ====
Para moitos de nós o primeiro programa que fixemos en arduino é o blink que está en **Arquivo > Exemplos > 01.Basics>Blink**. Ademais de ser o equivalente ao "Hello World", e a forma de comprobar que todo vai ben ata aquí. Na tarxeta Auriga do Ranger, o led soldado na placa (o led "ON BOARD") está conectado no pin 13, como no Arduino UNO. Pero a montaxe da placa fai que quede oculto. Por desgraza non temos ningún outro LED na placa que sexa igual de fácil de manexar para comprobar que todo vai ben.
==== Fagamos un blink cos Neopixel ====
O círculo de luces que ten a placa Auriga do Ranger está formado por un tipo de LED un tanto especial: os NEOPIXEL. Para manexalos tamén hai unha librería, neste caso de **Adafruit**: [[https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library|https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library]].
No noso caso temos un anel formado por 12 Neopixel que están conectados ao pin 44. Para que o exemplo funcione co Ranger debemos poñer estes valores:
**#define PIN 44 **
**#define NUMPIXELS 12 **
Con este exemplo podemos conseguir un efecto parecido ao do programa de exemplo Blink, xa que un dos LED parpadeará unha vez por segundo:
#include // Libreria para manexar o anel de Neopixels
int PIN = 44; // Pin no que están conectados os Neopixels
int NUMPIXELS = 12; // Número de Neopixels
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin (); // Esta instrucción inicializa a librería
}
void loop (){
// Con este código encendemos o pixel 8
pixels.setPixelColor(8, pixels.Color(175,0,0));
pixels.show();
delay (500);
pixels.setPixelColor(8, pixels.Color(0,0,0));
pixels.show();
delay (500);
}
Debedes ter en conta que o anel de Neopixels está moi preto dos sensores de luz, polo que interfiren moito con eles cando algún LED está aceso.