Софт SPI на DigitalIO для nRF24L01+
- Войдите на сайт для отправки комментариев
Пт, 04/11/2016 - 11:17
Доброго времени суток.
В продолжение предыдущей проблемы. Решил подключить приемник по Софт SPI. Опирался на этот и этот форум.
файл RF24_config.h в корневом каталоге библиотеки отредактировал так:
/* Copyright (C) 2011 J. Coliz <maniacbug@ymail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. */ /* spaniakos <spaniakos@gmail.com> Added __ARDUINO_X86__ support */ #ifndef __RF24_CONFIG_H__ #define __RF24_CONFIG_H__ /*** USER DEFINES: ***/ //#define FAILURE_HANDLING //#define SERIAL_DEBUG //#define MINIMAL //#define SPI_UART // Requires library from https://github.com/TMRh20/Sketches/tree/master/SPI_UART //#define SOFTSPI // Requires library from https://github.com/greiman/DigitalIO /**********************/ #define rf24_max(a,b) (a>b?a:b) #define rf24_min(a,b) (a<b?a:b) #if defined SPI_HAS_TRANSACTION && !defined SPI_UART && !defined SOFTSPI #define RF24_SPI_TRANSACTIONS #endif //ATXMega #if defined(__AVR_ATxmega64D3__) || defined(__AVR_ATxmega128D3__) || defined(__AVR_ATxmega192D3__) || defined(__AVR_ATxmega256D3__) || defined(__AVR_ATxmega384D3__) // In order to be available both in windows and linux this should take presence here. #define XMEGA #define XMEGA_D3 #include "utility/ATXMegaD3/RF24_arch_config.h" #elif ( !defined (ARDUINO) ) // Any non-arduino device is handled via configure/Makefile // The configure script detects device and copies the correct includes.h file to /utility/includes.h // This behavior can be overridden by calling configure with respective parameters // The includes.h file defines either RF24_RPi, MRAA, LITTLEWIRE or RF24_SPIDEV and includes the correct RF24_arch_config.h file #include "utility/includes.h" //ATTiny #elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__) || defined(__AVR_ATtiny861__) #define RF24_TINY #include "utility/ATTiny/RF24_arch_config.h" //LittleWire #elif defined(LITTLEWIRE) #include "utility/LittleWire/RF24_arch_config.h" //Teensy #elif defined (TEENSYDUINO) #include "utility/Teensy/RF24_arch_config.h" //Everything else #else #include <Arduino.h> // RF modules support 10 Mhz SPI bus speed const uint32_t RF24_SPI_SPEED = 10000000; #if defined (ARDUINO) && !defined (__arm__) && !defined (__ARDUINO_X86__) #if defined SPI_UART #include <SPI_UART.h> #define _SPI uspi #elif defined SOFTSPI // change these pins to your liking // const uint8_t SOFT_SPI_MISO_PIN = 47; const uint8_t SOFT_SPI_MOSI_PIN = 49; const uint8_t SOFT_SPI_SCK_PIN = 45; const uint8_t SPI_MODE = 0; #define _SPI spi #else #include <SPI.h> #define _SPI SPI #endif #else // Define _BV for non-Arduino platforms and for Arduino DUE #include <stdint.h> #include <stdio.h> #include <string.h> #if defined(__arm__) || defined (__ARDUINO_X86__) #include <SPI.h> #endif #define _BV(x) (1<<(x)) #if !defined(__arm__) && !defined (__ARDUINO_X86__) extern HardwareSPI SPI; #endif #define _SPI SPI #endif #ifdef SERIAL_DEBUG #define IF_SERIAL_DEBUG(x) ({x;}) #else #define IF_SERIAL_DEBUG(x) #if defined(RF24_TINY) #define printf_P(...) #endif #endif #if defined (__ARDUINO_X86__) #define printf_P printf #define _BV(bit) (1<<(bit)) #endif // Progmem is Arduino-specific // Arduino DUE is arm and does not include avr/pgmspace #if defined (ARDUINO_ARCH_ESP8266) #define PSTR(x) (x) #define printf Serial.printf #define sprintf(...) os_sprintf( __VA_ARGS__ ) #define printf_P printf #define strlen_P strlen #define PROGMEM #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #define pgm_read_word(p) (*(p)) #define PRIPSTR "%s" #elif defined(ARDUINO) && ! defined(__arm__) && !defined (__ARDUINO_X86__) || defined(XMEGA) #include <avr/pgmspace.h> #define PRIPSTR "%S" #else #if ! defined(ARDUINO) // This doesn't work on Arduino DUE typedef char const char; #else // Fill in pgm_read_byte that is used, but missing from DUE #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) #endif typedef uint16_t prog_uint16_t; #define PSTR(x) (x) #define printf_P printf #define strlen_P strlen #define PROGMEM #define pgm_read_word(p) (*(p)) #define PRIPSTR "%s" #endif #endif #endif // __RF24_CONFIG_H__
Так же пробовал раскомментировать эту строку в этом же файле:
//#define SOFTSPI // Requires library from https://github.com/greiman/DigitalIO
Сам скетч получился такой:
#include<DigitalIO.h> #include<SPI.h> #include<nRF24L01.h> #include<RF24.h> SoftSPI<SOFT_SPI_MISO_PIN, SOFT_SPI_MOSI_PIN, SOFT_SPI_SCK_PIN, SPI_MODE> spi; const uint64_t pipe = {0xF0F0F0F0E1LL}; //адрес трубы RF24 radionrf(7, 6); //Мега byte red[4] = {1, 2, 3, 4}; //куда получем сообщение void setup() { Serial.begin(9600); //запуск серийного опрта radionrf.begin(); //запуск радиомодуля delay(100); //небольшая задержка для запуска radionrf.setChannel(0x112); radionrf.enableDynamicPayloads(); //отключаем изменение размера передаваемого буфера???? radionrf.openReadingPipe(1, pipe); //открываем трубу для прослушки radionrf.openWritingPipe(pipe); //Открывем трубу для отправки radionrf.startListening(); //начинаем слушать эфир } void loop() { if ( radionrf.available() ) { //если в эфире что-то есть, то radionrf.read( red, sizeof(red) ); //принимаем сообщение Serial.print(red[0]); //и выводим в серийный порт Serial.print(" "); Serial.print(red[1]); Serial.print(" "); Serial.print(red[2]); Serial.print(" "); Serial.print(red[3]); Serial.println(" "); } }//конец loop
При компиляции выдает гору ошибок (с раскомментированной строкой выше):
In file included from C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalIO.h:31:0, from RF24priem.ino:2: C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void badPinCheck(uint8_t)': C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:55:44: error: 'NUM_DIGITAL_PINS' was not declared in this scope if (!__builtin_constant_p(pin) || pin >= NUM_DIGITAL_PINS) { ^ C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void fastBitWriteSafe(volatile uint8_t*, uint8_t, bool)': C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:110:9: error: 'cli' was not declared in this scope cli(); ^ C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h: In function 'void fastPinMode(uint8_t, uint8_t)': C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:175:29: error: 'OUTPUT' was not declared in this scope fastDdrWrite(pin, mode == OUTPUT); ^ C:\Users\Администратор\Desktop\arduino-1.6.1\libraries\DigitalIO-master\src/DigitalPin.h:177:35: error: 'INPUT_PULLUP' was not declared in this scope fastDigitalWrite(pin, mode == INPUT_PULLUP); ^ Ошибка компиляции.
Насколько я понял, он пытается мне сказать, что таких пинов не существует. Т.е. он не понимает что я подключил Мегу, а так же что команды подтяжки пинов не существуют в данной библиотеке, что с этим сможно сделать?
Что интересно, не компилируется даже часть примеров из библиотеки.
например этот:
ошибка:
Скачал эту же библиотеку с другого сайта, не помогло. Ошибка та же что и при использовании в моем скетче.
Господа, ну может кто-нибудь тогда подскажет как подключить хотя бы SD карту на программный SPI?
Проблема решилась подключением SD к SPI через буфер HEF4050, а nRF24L01+ напрямую к выходам SPI на ардуино.
Как я и писал, есть не правильные модули, как раз вам такой и попался, но как вы уже поняли эту железячную проблему можно исправить.
А для того что бы радиомодуль NRF24 работал на softSPI я использую библиотеки https://github.com/TMRh20 и https://github.com/greiman/DigitalIO. Естественно строчку #define SOFTSPI надо раскомменить.
Для того что бы SD Card работал на softSPI нужно в Sd2Card.cpp закомментировать //#define USE_SPI_LIB
а в Sd2Card.h: закомментировать //#define USE_SPI_LIB и раскомментировать #define MEGA_SOFT_SPI 1
Ну и необходимо помнить, что если вы внесли изменения в библиотеку, то при ее испльзовании в другом проекте, где не нужен softSPI, придется убирать внесенные изменения.
Или же для пректа с изменной библиотекой создать отдельную папку libraries и сложить туда все заюзанные библиотеки, а в ИДЕ потом выбирать какие библиотеки использовать.
Ну и необходимо помнить, что если вы внесли изменения в библиотеку, то при ее испльзовании в другом проекте, где не нужен softSPI, придется убирать внесенные изменения.
Или же для пректа с изменной библиотекой создать отдельную папку libraries и сложить туда все заюзанные библиотеки, а в ИДЕ потом выбирать какие библиотеки использовать.
Я использовал обычную библиотеку, просто добавил буфер и все заработало. А так да, у меня отдельная папка под каждый проект на ардуине с библиотеками под него. Т.к. пару раз было что библиотека с одного сайт аработает, а с другого нет. Ищи свищи ее потом.
Я использовал обычную библиотеку, просто добавил буфер и все заработало.
Подскажите пожалуйста, такой буфер подойдёт?