Transferir dados entre o ATtiny85 | ATmega128 usando nRF24L01

Olá,

Desde o último projeto tenho estado empenhado em construir um alarme de casa sem fios.

Numa fase inicial pensei usar o RF433, tive algumas dificuldades em colocar em funcionamento, este dispositivo não se dá muito bem com programação AVR Atmel Studio, principalmente porque uma das limitações é o facto de ter conseguido colocar 2 emissores e 1 recetor.

Rapidamente abandonei o sensor de RF433 para um outro dispositivo que poderá comunicar com vários emissores e 1 recetor.

Confesso que não experimentei ainda com 2 emissores, por não possuir suficientes componentes, no entanto já encomendei mais 3 nRF24L01, para fazer a experiência, enquanto aguardo pela encomenda avanço com este tutorial com a convicção que certamente conseguirei colocar vários emissores e um só recetor.

O objetivo não será “ainda” explicar como construir um alarme sem fios, mas sim o funcionamento deste componente o nRF24L01.

Como tem vindo ser apanágio da minha parte não vou aprofundar muito o tema , visto já existirem vários sites com este componente bem explicado, exemplos: https://wiki.analog.com/resources/eval/sdp/sdp-b/peripherals/spi

http://www.diyembedded.com/tutorials/nrf24l01_0/nrf24l01_tutorial_0.pdf

Como têm reparado ultimamente tenho estado de volta do ATtiny85, fiquei muito interessado em fazer projetos com este pequeno componente, limitado nos pinos e nas funcionalidades internas, mas capaz de fazer alguns projetos interessantes.

Muita informação e projetos em Arduino, mas programação com AVR Studio, raramente se encontra, assim fica mais interessante o desafio.

Foi este vídeo  que me impulsionou para avançar na construção de um programa para o Attiny85 com o nRF24L01.

Encontrei algumas dificuldades em colocar o ATtiny85 com AVR Studio7 em pleno funcionamento, visto que o SPI ( Serial Port interface ) teria de ser “emulado” por software.

Não tendo conseguido encontrar a libraria do nRF24L01 para simular no Proteus, ainda ficou mais abstrato o debug do SPI, no entanto passo a passo fui descodificando o modo de funcionamento do nRF24L01 e adaptei ao ATtiny85.

O nRF24L01 que usei foi um dos dispositivos que compõe o KIT OPEN128, ver imagem:

 

Cujo pinout é um pouco diferente dos atuais:

Com esta configuração verificamos que existem 6 pinos que deverão ser usados, ou seja, os pinos disponíveis pelo ATtiny85, no entanto se o projeto que se pretende fazer é um alarme, ficaríamos sem qualquer pino para receber informação, neste caso era preferível usar o ATmega8 e todas as dificuldades eram simplificadas ?

 

O que deveremos ter em atenção que este dispositivo é tolerante a 5V no envio e receção de dados mas NÃO na alimentação que sugere-se os 3.3V.

Ora 3.3V para quem usa o ATtiny85 praticamente não usa projetos em arduino, obriga a fazer um divisor de tensão com 3 resistências, mas; nada como procurar nas gavetas e encontrar um regulador compacto. Do tamanho do ATtiny85, “ 5V to 3.3V Step Down AMS1117” www.electrofun.pt

É obvio que estes componentes foram selecionados para teste, no trabalho final teremos de ter em consideração os consumos e o tamanho global do transmissor, visto que irá funcionar a bateria e o consumo é extremamente importante.

Para este protótipo usou-se os seguintes componentes:

1 Conversor USB – TTL (PL2303)                                http://www.botnroll.com

1 Programador Atmel, USBASP V2.0                      https://comink.pt

1 ATMEL ATMega128 AVR ISP JTAG                      https://comink.pt

1 ATtiny85 – AVR 8 Pin 20MHz 8K                            https://www.ptrobotics.com

1 Socket USBASP ATtiny85                                           Tutorial Microelectronic

1 USBASP 10Pin Módulo Conversor Padrão 6Pin  https://pt.gearbest.com

3 Emissor e receptor wireless, NRF24L01+            https://comink.pt

1 Universal Power Supply 5V 2A                               https://www.ptrobotics.com

1 Fonte para breadboard 3.3V e 5V                          https://comink.pt

Varios Jumper Macho / Femea 1 fio 20cm             https://comink.pt

 

Avançando para o código, se já viram o vídeo que sugeri perceberam que o
ATtiny85 usa o USI ( universal serial interface ) SPI | I2C ou seja é composto de dupla funcionalidade, no que pretendemos temos o SPI com 3 pinos MOSI – MISO -SCK, mas os registos internos são diferentes do ATmega128, nomeadamente o clock que devera ser gerado por software.

Construiu-se as macros para configurar os pinos do ATtiny85.

As macros que vão permitir ler e escrever no nRF24L01

O setup de inicialização do nRF24, configurando os respetivos pinos como entradas e saídas, incluindo a configuração dos registos USICR para gerar o clock de sincronismo, no final o CSN_1 ( chip select not), desativado  e selecionando CE_0 o nRF24 para carregar dados.

A função ler/escrever bytes permite gerar os impulsos de clock para transmissão / receção de dados

O código de envio de dados pelo ATtiny85 com nRF24L01.

main nRF24L01
 /*
  * main.c for NRF24L01 sensor
  * Created: 15-07-2018
  * Author : Norlinux
  * http://www.microelectronic.pt
  * https://www.facebook.com/MundoDosMicrocontroladores/
  * Released under GPLv3.
  * Please refer to LICENSE file for licensing information.
  * which can be found at http://www.gnu.org/licenses/gpl.txt
  */ 

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <avr/sfr_defs.h>
#include <util/delay.h>
#include "NRF24L01.h"


extern uint8_t TX_BUF[];

int main(void)
{
	uint8_t ctr = 0;
	nRF24L01_Initial();
    while (1) {
				
				TX_BUF[0]=ctr++;
				NRF24L01_Send();
				_delay_ms(1000);
			  }
}

 Em breve dar-vos-ei a explicação de como tudo acontece, no video abaixo temos a receção dos dados no ATmega128, pela porta serie.

 

 

Deixe uma resposta

Your email address will not be published.

www.000webhost.com