====== ZigBee ====== //Conhecimento prévio: [HW] [[en:hardware:homelab:controller]], [AVR] [[en:avr:usart]], [LIB] [[en:software:homelab:library:usart]], \\ [LIB] [[en:software:homelab:library:module:lcd_graphic]]// ===== Teoria ===== [{{ ::examples:communication:xbee.jpg?220|XBee module.}}] ZigBee é uma especificação para protocolos de comunicação de alto nível usando sinais de rádio digital de baixa potência baseados na norma IEEE 802.15.4-2003 para redes de área pessoal. ZigBee foi desenhado para dispositivos que requerem redes sem fios simples que não necessitem de alta taxa de transferência de dados. Estes dispositivos podem ser, por exemplo redes de sensores, displays de informação, sistemas automáticos industriais e de casa, etc. Principal benefício em comparação com o Bluetooth é a menor demanda de alimentação, responsa mais rápida do estado de sono, e o custo. O ZigBee funciona na maioria dos casos à freqüência de banda de rádio de 2.4 GHz com taxas de transmissão de dados entre os 20 e os 900 kb/s. O protocolo ZigBee oferece suporte a diferentes tipos de rede, como estrela, árvore e malha genérica. Os nós da rede podem ter diferentes papéis como coordenador, roteador ou dispositivo final. Baseado em módulos sem fio ZigBee podem ser configuradas conexões directas entre dois dispositivos ou redes mais complicadas. Na figura seguinte uma rede de sensores de medição para a transferência de interface do utilizador é ilustrada. ===== Prática ===== A placa de comunicação do Robotic HomeLab tem um conector para módulos sem fio, incluindo módulo ZigBee XBee da Maxtream. A comunicação entre o módulo e o controlador é realizada através da interface UART. Em primeiro, o dispositivo é configurado para o modo de API enviando o comando "+++". Outras configurações são feitas com comandos padrão AT encontrados no manual do dispositivo. Quando a comunicação entre os dois módulos for estabelecida, o dispositivo irá entrar em modo de transmissão. O código de exemplo em cima está à procura de outros dispositivos ZigBee nas próximidades e encontrou dispositivos de endereços de dispositivo que são exibidos no visor do módulo LCD User Interface Homelab. O endereço global 0000FFFF tem um significado especial - informação enviada para este endereço é recebida por todos os dispositivos disponíveis. No código de exemplo, depois de pesquisar outros dispositivos um é ligado e os dispositivos iniciam o envio entre eles de eventos de premir botão, mostrando o resultado no LED do outro dispositivo. #include #include #include #include //Adding ZigBee module support #include // Determination of the USART interface usart port = USART(1); // LED and button pin setup pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; pin buttons[3] = { PIN(C, 0), PIN(C, 1), PIN(C, 2) }; // Max numbers of ZigBee modules in network + broadcast address +1 #define ZIGBEE_MAX_NODES 4 int8_t wait_button(uint16_t ms); // Address array of other Zigbee modules found in network zigbee_node_t nodelist[ZIGBEE_MAX_NODES]; int main(void) { uint8_t adr = 0; //Acquired module order list // LED and buttons I/O ports configuration for (int i=0; i<3; i++) { pin_setup_output(leds[i]); pin_setup_input(buttons[i]); } // Configuration of USART interface for communication whit ZigBee module usart_init_async(port, USART_DATABITS_8, USART_STOPBITS_ONE, USART_PARITY_NONE, USART_BAUDRATE_ASYNC(9600)); // LCD display initalization lcd_gfx_init(); // Clear LCD lcd_gfx_clear(); // Turning back light ON lcd_gfx_backlight(true); //Wait until other ZigBee modules are searched from area near by lcd_gfx_clear(); lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string(" ZigBee demo"); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Searching..."); // Searching other ZigBee modules // fills nodelist array with found modules info zigbee_find_nodes(port, nodelist, ZIGBEE_MAX_NODES); //lcd_gfx_clear(); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Found: "); // Displays the list of found modules on LCD // (on what line to write, where takes addr., how many max) zigbee_lcd_show_nodes(2, nodelist, ZIGBEE_MAX_NODES); hw_delay_ms(3000); lcd_gfx_clear(); // Displaying connecting on LCD lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string("Connecting..."); lcd_gfx_goto_char_xy(0, 1); //Displays only 8 last digit form the address lcd_gfx_write_string((nodelist + adr)->address64l); // Confederate ZigBee to send info for chosen ZigBee module's node, // in this case to first [0] // (What port is using, where takes the address) zigbee_set_destination(port, &nodelist[adr]); // Displays info on LCD lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string(" ZigBee demo"); lcd_gfx_goto_char_xy(0, 1); lcd_gfx_write_string("Button1: LED1"); lcd_gfx_goto_char_xy(0, 2); lcd_gfx_write_string("Button2: LED2"); // Save the state of previous button to avoid multiple button pushes at once. // At first is -1 ie none of the buttons is pushed. int8_t previousButton = -1; // Endles-loop for communicating between modules while (true) { int8_t button; //variable for saving button pushes // wait 1 millisecond for button button = wait_button(1); // if in last cycle button wasn't pressed but now is if (previousButton == -1 && button != -1) { // Convert button's index by adding A // and sent it to other modules // A is for first button, B for second and so on usart_send_char(port, 'A' + button); } // read from USART if (usart_has_data(port)) { // Read bait, convert to leds array index //and change the output. pin_toggle(leds[usart_read_char(port) - 'A']); } // remember what button was pressed previousButton = button; } } // Wait for button to be pressed for ms milliseconds. //If button is pressed returns the queue number of the button int8_t wait_button(uint16_t ms) { // By default -1 means, that no button is pressed. int8_t button_nr = -1; uint16_t counter = 0; do { // check if one of the buttons is pressed for (uint8_t i=0; i<3; i++) { if (!pin_get_value(buttons[i])) { button_nr = i; break; } } // wait for 1 millisecond hw_delay_ms(1); // increase millisecond counter counter++; } while (button_nr == -1 && (counter < ms)); return button_nr; }