Atmega328 con un WiFly RN171

 
- página modificada en julio del 2013 - (English version)


en este página hay:
- descripción genérico del circuito.
- conectar un FT232RL al Atmega328 a través del míni USB.
- cargar el "bootloader" con un AVRISPmkII programador.
- visualizador del diagrama electrónico del circuito.
- programar el Atmega328.
- código básico del Atmega328.
- conectar el WiFly a una red local.
- un "patch" creado en Pd-extended para visualizar datos del WiFly en 10bits.
- código entorno SuperCollider para recibir datos del WiFly.

descripción genérico del circuito

El circuito compacto, que mide solo 5cm * 4,3cm (la medida de la batería Li-Ion, una UNIROSS de 700mA), tiene el concepto igual al circuito anteriormente realizado link, que transmitir datos inalámbricos con un Nordic nRF24L01. La gran ventaja de utilizar el WiFly es que la mayoría de los ordenadores tienen un modulo WiFi incorporado, así se puede conectar el circuito a cualquier ordenador sin tener un receptor externo.

El precio del RN171 es de 23E. Para realizar una red inalámbrico con un xBee Znet, por ejemplo, hace falta tener dos módulos de 40E cada uno. Lo mismo, o aún mas caro, es el Easy-Radio de 94E para dos unidades. Genial barato es el Nordic nRF24L01 que se puede conseguir por 3,50E cada uno. Si se realiza la placa DIS, con los componentes, el precio sale alrededor de 12E para dos placas. Pero soldar el Nordic tiene sus trucos y sin tener mucho experiencia recomiendo comprar un módulo ya hecho.

Muy útil es, que el circuito lleva un cargador de Li-Ion, el MAX1555, incorporado y en conectar lo con el míni USB se puede cargar la pila. Hay una LED verde que indica el estado de la pila y si la LED se apaga la pila esta cargada.

El mismo mini USB se utiliza para programar el Atmega328. Hace falta tener un “level shifter”, el FT232RL para programar el Atmega. El Arduino LilyPad se programa igual como la placa mía (mira instrucción como programar). Para conectar el míni USB a la placa FT232 hace falta tener un cable USB con maya & 5 hilos. Para programar este circuito he hecho el cable io mismo.


conectar un FT232RL al Atmega328 a travez de un míni USB

placa FT232: TXD > D- míni USB > RXD Atmega328 pin 30.

placa FT232: RXD > D+ míni USB > TXD Atmega328 pin 31.

placa FT232: RTS > ID míni USB > RESET Atmega328 al RST cap C7. (mira esquema).

placa FT232: 5V > VBUS míni USB > 5V mini USB.

placa FT232: GND > GND míni USB > GND mini USB.




A parte: En los modelos nuevos de los diferentes modelos del Arduino el FT232RL está reemplazado por otro Atmega que es técnicamente discutible, pero tiene la ventaja del precio (el FT232RL es caro) y la posibilidad de enviar datos en distintos formatos, por ejemplo MIDI, directamente al USB. Pero tener dos microchips en una placa no hace mucho sentido porque se podría hacer todo con solo un Atmega.


test

El circuito lleva un cargador de Li-Ion, un MAX1555, un LDO (regulador de tensión con poco caída de tensión entre entrada y salida), el TPS 7933, un Atmega328 y un módulo WiFly, el RN171. Además permite enchufar en las filas de pines una variedad de sensores.



Antes de estar capaz de programar el Atemaga328, o cualquier Atmega, con un FT232RL (los antiguos Arduinio han tenido un FT232RL incorporado en la placa) hace falta tener un “bootloader” programado.


cargar el "bootloader" con un AVRISP mkII

Los mas fácil es cargar el “bootloader” en el entorno de Arduino IDE. El precio de programador de Atmel, el AVRISP mkII, es razonbable, alrededor de 28E.
El circuito lleva un conector ISP de 6 pins. Ojo, el AVRISP mkII esta alimentado por el USB, pero para cargar el “bootloader” el Atgmega328 de la placa tiene que estar alimentado con la batería o se conecta la placa a través del míni USB.

SSS

Por la altura de lo pins del conector ISP (JP3) de 6 pins he desoldado el enchufe una vez cargado el “bootloader”.
La conneción de los pins esta documentado en el diagrama electrónico adjuntado. (abajo de la página)
Más info ( en inglés): http://www.arduino.cc/en/Hacking/Bootloader

visualizar el diagrama electrónico del circuito
diagrama del circuito


programar el Atmega328

Programar el Atmega328 con configuración de los puertos & analog read del A0:

Antes de tener la habilidad de configurar el WiFly RN171 por aire hay que configurar los puertos del Atmega328. Para que el WiFly RN171 se conecta automáticamente a una red local y tener la posibilidad de configurar el mismo a través de un terminal (shell), hace falta conectar el GPIO_9 (pin 4) del RN171 a 3V. Este pin esta conectado al puerto PB0 del Atmega328 (pin12) y a través de la resistencia R12 a 3V. En meter el PB0 high el WiFly se conecta automáticamente a una red local (red abierta).

El programa de abajo se carga fácilmente en el entorno del Ardunio IDE. Hay que elegir el puerto serial correcto: Tools > Serial Port > dev/ttyUSB0 (en mi caso) y elegir el Borad > Arduino Pro o Pro Mini (5V, 16MHz) w, Atmega328.


código basico del Atmega328

/*
  Analog read for PH probe 10 bit.
 
 Reads an analog input pin, ANALOG PIN 0 and sends the data to the serial port.
 
 Protocol:
 The protocol is a three byte data package,
 Header = 0;
 PhHi   = Hi-byte of 10 bit & address (64 addresses max)
 PhLo   = Lo-byte.
 
  The circuit:
 * Connect the PH probe to the AN0 (analog 0)
 
   created 22 May. 2013
   Martin Hug
 
 */
 
 
// variables declaration:

const int analogInPin = A0; // Analog input pin that the Ph probe is connected.

int sensorValue = 0;        // 10bit value read from the PH probe.
byte address = 4;           // 00000100, first possible address.
byte PhLo = 0;              // Lo-byte of 10 bit data.
byte PhHi = 0;              // Hi-byte of 10 bit data.

void setup() {
  // set PORTB, GPIO_9 del WiFly (PB0), LED (PB1) & 3V(PB2).
  DDRB = B00000111;
 
  Serial.begin(9600);
}

void loop() {
  PORTB = B00000111;   // WiFly connect to local red, LED ON , 3V ON.
  sensorValue = analogRead(analogInPin);           

  PhHi = address | sensorValue>>8; // merge adddress and upper byte.
  PhLo = sensorValue;              // lower byte.
 

  // print the results to the serial monitor:
  // Use Serial.println ASCII for(Pd) and  Serial.write DECINAL for SuperCollider (and Serial Monitor).
 
  // for Pd-extended  
  Serial.println(0);    // header byte.
  Serial.println(PhHi); // first byte.
  Serial.println(PhLo); // second byte.
 
  // for SuperCollider
  /*Serial.write(0);    // header byte.
  Serial.write(PhHi); // first byte.
  Serial.write(PhLo); // second byte.*/
 
  delay(50);  // increase value for slower data transfer.                  
}



conectar el WiFly RN171 a una red local

Una vez cargado el programa y después de haber reiniciado el circuito los LED's del WiFly parpadean y la LED rojo del PB1 estará encendida.

Una vez llegado a este punto solo falta en conectar el WiFly a la red local. Por su puesto esto solo funciona, si el ordenador tiene un módulo WiFI inalámbrico incorporado.

Reiniciamos la red inalámbrico del ordenador (después de haber iniciado el circuito) y buscamos WiFly-EZX-43 o tengo otro que es WiFly-GSX-cd. Una vez establecido la conexión comprobamos si se puede comunicar con el WiFly.


Desde un terminal: telnet 1.2.3.4 2000 o para el GSX-cd: telnet 169.254.1 2000
telnet 1.2.3.4 2000
Trying 1.2.3.4...
Connected to 1.2.3.4.
Escape character is '^]'.
*HELLO*

Si la respuesta es *HELLO* sabemos que la comunicación con el WiFly se ha establecido.


un "patch" de Pd-extended para el WiFly

Pd patch receiving 10bit data from Arduino 328
Todo que no es visible en la imágen está incluido en el ZIP que se puede decargar abajo de la página. El patch esta previsto para tener ocho canales indpendientes del WiFly.

Protocolo de 3 bytes para tener una resolución de 10bits y tener 6 bits de direccionamiento.
Desde el WiFly se envía 3 bytes:
1.B00000000: header;  // byte de inicio
2.B000000DD: D son los 2 bits de los 10bits
3.BDDDDDDDD; 8 bits del byte de menos peso.




código entorno SuperCollider para recibir datos del WiFly
(
~pipe = Pipe.new("telnet 1.2.3.4 2000", "r");
Routine({
    var byte, address, loByte, hiByte, val, chan, index= 0, toUnsignedByte;
    inf.do{

        toUnsignedByte = {arg x;

            ((x < -128) || (x > 127)).if {}; // signed Byte to unsigend Byte.

            (x < 0).if {256 + x} {x}
        };

        while({byte = toUnsignedByte.(~pipe.getChar.ascii); byte.isNil}, {nil}); //wait for data.

          if(index==0 and:{byte==0},
            {
                index= 1;
            }, {
                if(index==1, {
                    hiByte= byte;
                    index= 2;
                    },
                    {
                        if(index==2, {
                            loByte= byte;
                            chan= (hiByte&2r11111100)>>2; // mask 2 lower data-bites
                            val= ((hiByte&2r00000011)<<8)|loByte;
                            ("chan:"+chan+"val:"+val).postln;
                              ~action_gui.value(chan, val);

                            index= 0;
                        });
                });
            })
    };
}).play;
)
//
// gracias a Glen Fraser y Sam de llucec.org para ayudar me al ecribir el código.







HTML Comment Box is loading comments...




links related to this page. Opens new window (only IE)

 


bajar los ficheros del proyecto descarga los ficheros relacionados con este página