Just found a pair of "old" NRF51822-04 ... any good?
-
Hi there! It's been a long time, I've been away from this forum for a while, tinkering with Zigbee and HomeAssistant... but I'm planning my new garage, so here I am.
I've found, as title says, three stamp-sized Nordic chips: are they still any good? I don't need much coverage, but I'd try something newer than the 328p's I have on MyNode PCBs.
Thanks to all!
Marco
-
Hello, @ghiglie yes you can use them with MySensors but they are not great for battery-powered sensors due to a hardware bug. If you use them as main-powered sensors they are fine, and range is decent with those.
-
Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.
-
@ghiglie Check out these links if you haven't used NRF5 before. They should help you get started.
https://forum.mysensors.org/topic/9266/guide-nrf5-nrf51-nrf52-for-beginners
https://www.openhardware.io/view/376/MySensors-NRF5-PlatformI found the ST-LINK programmer to be easier to work with (using Windows) that the J-LINK
-
Hi all,
sorry for being so late, again...@nca78 said in Just found a pair of "old" NRF51822-04 ... any good?:
Hello, @ghiglie yes you can use them with MySensors but they are not great for battery-powered sensors due to a hardware bug. If you use them as main-powered sensors they are fine, and range is decent with those.
@monte said in Just found a pair of "old" NRF51822-04 ... any good?:
Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.Oh, ok, I'll keep it in mind. I'm a good copy'n'paste-r , so as soon as I get to work on a chip, I'll look for the sleep code. Thanks for pointing that!
I'm really look for battery powered sensors, as for mains powered ones I use "easier" chips as ESPs, mainly on bigger dev modules (such as NodeMCU) since I have more space.@petewill said in Just found a pair of "old" NRF51822-04 ... any good?:
@ghiglie Check out these links if you haven't used NRF5 before. They should help you get started.
https://forum.mysensors.org/topic/9266/guide-nrf5-nrf51-nrf52-for-beginners
https://www.openhardware.io/view/376/MySensors-NRF5-PlatformI found the ST-LINK programmer to be easier to work with (using Windows) that the J-LINK
I have a ST-LINK I bought since I saw this chips mentioned in @NeverDie 's threads , but then I tried some STM32 blue pills and finally got a working Black Magic Probe.
Now I just have to deal with the soldering, but I saw something like an adapter with pushpins...I'll keep you updated!
-
Well, I'm sorry I'm sooo late, but I had to stop all my testing.
I'll definitely be back after ordering some new tools during Chinese New Yes sales...!
-
Let us know if NRF51822-04 is any good.
-
Well, for now, no updates! Working with pro-minis is still much more fun with my humble skills. I'm a good soldering-pad destroyer when it comes to SMD.
In the while, I can't find a sort of adapter for SMD versione of NRF5 boards, like the flasher for ESP8266. Is there something like that out there?
-
@Holosteric & @ghiglie I am actively working on the NRF51822. I am testing @NeverDie 's PIR and Temp/Humidity sketches. The example sketches of Mysensors didn't work well for me.
I will report the results.
Main sketch// SUMMARY: This demo sketch runs on the AM612 PIR v607 PCBto transmit battery voltage (heartbeat) and motion detections to a MySensors gateway using MySensors protocols. // Note: because this is a passive node, node ID must be set manually to a unique sensor node ID: #define MY_NODE_ID 143 // Passive mode requires static node ID //#define MY_CORE_ONLY #define MY_PASSIVE_NODE #define MY_RADIO_NRF5_ESB #define IS_NRF51 //true iff the target is an nRF51. If an nRF52, then comment this line out! #define PIR_DETECTION_PIN 2 #define SHORT_WAIT 50 #include <MySensors.h> //#include <Wire.h> #include <Adafruit_BME280.h> // Enable debug prints //#define MY_DEBUG volatile bool motion_change=false; Adafruit_BME280 bme; // use I2C interface Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); Adafruit_Sensor *bme_humidity = bme.getHumiditySensor(); void disableNfc() { //only applied to nRF52 #ifndef IS_NRF51 //Make pins 9 and 10 usable as GPIO pins. NRF_NFCT->TASKS_DISABLE=1; //disable NFC NRF_NVMC->CONFIG=1; // Write enable the UICR NRF_UICR->NFCPINS=0; //Make pins 9 and 10 usable as GPIO pins. NRF_NVMC->CONFIG=0; // Put the UICR back into read-only mode. #endif } void turnOffRadio() { NRF_RADIO->TASKS_DISABLE=1; while (!(NRF_RADIO->EVENTS_DISABLED)) {} //until radio is confirmed disabled } void turnOffUarte0() { #ifndef IS_NRF51 NRF_UARTE0->TASKS_STOPRX = 1; NRF_UARTE0->TASKS_STOPTX = 1; NRF_UARTE0->TASKS_SUSPEND = 1; NRF_UARTE0->ENABLE=0; //disable UART0 while (NRF_UARTE0->ENABLE!=0) {}; //wait until UART0 is confirmed disabled. #endif #ifdef IS_NRF51 NRF_UART0->TASKS_STOPRX = 1; NRF_UART0->TASKS_STOPTX = 1; NRF_UART0->TASKS_SUSPEND = 1; NRF_UART0->ENABLE=0; //disable UART0 while (NRF_UART0->ENABLE!=0) {}; //wait until UART0 is confirmed disabled. #endif } void turnOffAdc() { #ifndef IS_NRF51 if (NRF_SAADC->ENABLE) { //if enabled, then disable the SAADC NRF_SAADC->TASKS_STOP=1; while (NRF_SAADC->EVENTS_STOPPED) {} //wait until stopping of SAADC is confirmed NRF_SAADC->ENABLE=0; //disable the SAADC while (NRF_SAADC->ENABLE) {} //wait until the disable is confirmed } #endif } void turnOffHighFrequencyClock() { NRF_CLOCK->TASKS_HFCLKSTOP = 1; while ((NRF_CLOCK->HFCLKSTAT) & 0x0100) {} //wait as long as HF clock is still running. } void mySleepPrepare() { //turn-off energy drains prior to sleep turnOffHighFrequencyClock(); turnOffRadio(); turnOffUarte0(); } void activateLpComp() { NRF_LPCOMP->PSEL=3; // monitor AIN0 (i.e. pin P0.02 on nRF52832 PIR Motion Sensor v607). while (!(NRF_LPCOMP->PSEL==3)) {} //wait until confirmed NRF_LPCOMP->REFSEL=3; // choose 1/2 VDD as the reference voltage while (!(NRF_LPCOMP->REFSEL==3)) {} //wait until confirmed NRF_LPCOMP->ANADETECT=0; //detect CROSS events on PIR detection pin while (NRF_LPCOMP->ANADETECT!=0) {} //wait until confirmed NRF_LPCOMP->INTENSET=B1000; //Enable interrupt for CROSS event while (!(((NRF_LPCOMP->INTENSET)&B1000)==B1000)) {} //wait until confirmed NRF_LPCOMP->ENABLE=1; //Enable LPCOMP while (!(NRF_LPCOMP->ENABLE==1)) {} //wait until confirmed NRF_LPCOMP->TASKS_START=1; //start the LPCOMP while (!(NRF_LPCOMP->EVENTS_READY)) {} //wait until ready NVIC_SetPriority(LPCOMP_IRQn, 15); NVIC_ClearPendingIRQ(LPCOMP_IRQn); NVIC_EnableIRQ(LPCOMP_IRQn); } void suspendLpComp() { //suspend getting more interrupts from LPCOMP before the first interrupt can be handled if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) { //if LPCOMP is enabled NRF_LPCOMP->INTENCLR=B0100; //disable interrupt from LPCOMP while (((NRF_LPCOMP->INTENCLR)&B0100)==B0100) {} //wait until confirmed } } void resumeLpComp() { //suspend getting interrupts from LPCOMP NRF_LPCOMP->INTENSET=B0100; //Enable interrupt for UP event while (((NRF_LPCOMP->INTENSET)&B1000)!=B0100) {} //wait until confirmed } #define CHILD_ID 1 // Id of the motion sensor child #define ID_S_MULTIMETER 28 #define CHILD_ID_TEMP 2 #define CHILD_ID_HUMID 3 #define CHILD_ID_BARO 4 // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); MyMessage msg_S_MULTIMETER_V_VOLTAGE(ID_S_MULTIMETER,V_VOLTAGE); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgHumid(CHILD_ID_HUMID, V_HUM); MyMessage msgPressure(CHILD_ID_BARO, V_PRESSURE); float batteryVoltage=0; float temperature=0; int humidity=0; float pressure=0; void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("PIR BME Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); wait(SHORT_WAIT); present(ID_S_MULTIMETER,S_MULTIMETER,"Electric Station"); wait(SHORT_WAIT); present(CHILD_ID_TEMP, S_TEMP, "PIR TEST Temperature", true); wait(SHORT_WAIT); present(CHILD_ID_HUMID, S_HUM, "PIR TEST Humidity", true); wait(SHORT_WAIT); present(CHILD_ID_BARO, S_BARO, "PIR TEST Pressure", true); wait(SHORT_WAIT); } void setup() { hwInit(); hwPinMode(PIR_DETECTION_PIN,INPUT); if (!bme.begin(0x76)) { while (1) delay(100); } disableNfc(); //remove unnecessary energy drains turnOffAdc(); //remove unnecessary energy drains activateLpComp(); NRF_CLOCK->INTENSET=B11; //enable interrupts for EVENTS_HFCLKSTARTED and EVENTS_LFCLKSTARTED NRF_CLOCK->TASKS_HFCLKSTART=1; //start the high frequency crystal oscillator clock while (!(NRF_CLOCK->EVENTS_HFCLKSTARTED)) {} //wait until high frequency crystal oscillator clock is up to speed and working motion_change=false; } void mySleep(uint32_t ms) { mySleepPrepare(); //Take steps to reduce drains on battery current prior to sleeping sleep(ms); } bool motionDetected=false; void loop() { // sensors_event_t temp_event, pressure_event, humidity_event; // bme_temp->getEvent(&temp_event); // bme_pressure->getEvent(&pressure_event); // bme_humidity->getEvent(&humidity_event); // temperature=bme.readTemperature(); // humidity=bme.readHumidity(); // pressure=bme.readPressure()/100.0F; mySleep(300000); //sleep for 5 minutes if (motion_change) { motionDetected=!motionDetected; if (motionDetected) { // digitalWrite(LED_BUILTIN,HIGH); //turn-on LED to signify motion detected send(msg.set("1")); // motion detected } else { // digitalWrite(LED_BUILTIN,LOW); //turn-off LED to signify motion no longer detected send(msg.set("0")); // send all-clear to prepare for future detections } NRF_LPCOMP->EVENTS_CROSS=0; motion_change=false; } else { //must be a scheduled wake-up. Time to report voltage as a heartbeat. sensors_event_t temp_event, pressure_event, humidity_event; bme_temp->getEvent(&temp_event); bme_pressure->getEvent(&pressure_event); bme_humidity->getEvent(&humidity_event); temperature=bme.readTemperature(); humidity=bme.readHumidity(); pressure=bme.readPressure()/100.0F; wait(100); send(msgTemp.set(temperature,2)); wait(100); send(msgHumid.set(humidity,2)); wait(100); send(msgPressure.set(pressure,2)); wait(100); batteryVoltage=((float)hwCPUVoltage())/1000.0; //take voltage measurement after transmission to hopefully measure lowest voltage that occurs. send(msg_S_MULTIMETER_V_VOLTAGE.set(batteryVoltage,3)); //send battery voltage with 3 decimal places } } // * Reset events and read back on nRF52 //* http://infocenter.nordicsemi.com/pdf/nRF52_Series_Migration_v1.0.pdf #if __CORTEX_M == 0x04 #define NRF5_RESET_EVENT(event) \ event = 0; \ (void)event #else #define NRF5_RESET_EVENT(event) event = 0 #endif // This must be in one line extern "C" { void LPCOMP_IRQHandler(void) {motion_change=true; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_CROSS); NRF_LPCOMP->EVENTS_CROSS=0; MY_HW_RTC->CC[0]=(MY_HW_RTC->COUNTER+2);}}
MyBoardNRF5.cpp
/* If you don't use an nRF5 board, you can ignore this file. This file was part of the "My Sensors nRF5 Boards" board repository available at https://github.com/mysensors/ArduinoBoards If you have questions, please refer the documentation at https://github.com/mysensors/ArduinoHwNRF5 first. This file is compatible with ArduinoHwNRF5 >= 0.2.0 This file allows you to change the relation between pins referenced in the Arduino IDE (0..31) and pins of the nRF5 MCU (P0.00..P0.31). If you can live with addressing the GPIO pins by using the Arduino pins 0..31 instead of a custom mapping, don't change this file. If you have a lot of Arduino code with fixed pin numbers and you need to map these pins to specific pins of the nRF5 MCU; you need to change this file. If you fill the "g_APinDescription" Array with numbers between 0..31, the Arduino pins 0..31 are assigned to pins P0.00..P0.31 of the MCU. As an example, if you need to change the pin mapping for Arduino pin 5 to P0.12 of the MCU, you have to write the 12 after PORT0 into the sixth position in the "g_APinDescription" Array. The extended attributes only affects the nRF5 variants provided with official Arduino boards. The arduino-nrf5 variant ignores the extended attributes. The pin mapping effects commands like "pinMode()", "digitalWrite()", "analogRead()" and "analogWrite()". If you change the pin mapping, you have to modify the pins in "MyBoardNRF5.h". Especially the analog pin mapping must be replaced with your pin numbers by replacing PIN_AIN0..7 with a number of your mapping array. You can use the constants PIN_AIN0..7 in the "g_APinDescription" Array if you want to reference analog ports MCU independent. You cannot use the pins P0.00 and P0.01 for GPIO, when the 32kHz crystal is connected. ########################################################################### Copyright (c) 2014-2015 Arduino LLC. All right reserved. Copyright (c) 2016 Arduino Srl. All right reserved. Copyright (c) 2017 Sensnology AB. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef MYBOARDNRF5 #include <variant.h> /* * Pins descriptions. Attributes are ignored by arduino-nrf5 variant. * Definition taken from Arduino Primo Core with ordered ports */ const PinDescription g_APinDescription[] = { { NOT_A_PORT, 0, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK { NOT_A_PORT, 1, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK { PORT0, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A0, PWM4, NOT_ON_TIMER}, { PORT0, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A1, PWM5, NOT_ON_TIMER}, { PORT0, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A2, PWM6, NOT_ON_TIMER}, { PORT0, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A3, PWM7, NOT_ON_TIMER}, { PORT0, 6, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT3 { PORT0, 7, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT4 { PORT0, 8, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), No_ADC_Channel, PWM10, NOT_ON_TIMER}, //USER_LED { PORT0, 9, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC1 { PORT0, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC2 { PORT0, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TX { PORT0, 12, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // RX { PORT0, 13, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA { PORT0, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL { PORT0, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA1 { PORT0, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL1 { PORT0, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP4 { PORT0, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP5 { PORT0, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT2 { PORT0, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1 { PORT0, 21, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1 { PORT0, 22, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), No_ADC_Channel, PWM9, NOT_ON_TIMER}, { PORT0, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), No_ADC_Channel, PWM8, NOT_ON_TIMER}, { PORT0, 24, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT { PORT0, 25, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //RED_LED { PORT0, 26, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //GREEN_LED { PORT0, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //BLUE_LED { PORT0, 28, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A4, PWM3, NOT_ON_TIMER}, { PORT0, 29, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A5, PWM2, NOT_ON_TIMER}, { PORT0, 30, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A6, PWM1, NOT_ON_TIMER}, #if defined(NRF52840) { PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER}, { PORT1, 32, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 33, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 34, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 35, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 36, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 37, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 38, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 39, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 40, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 41, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 42, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 43, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 44, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 45, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 46, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 47, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, { PORT1, 48, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER} #else { PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER} #endif }; // Don't remove this line #include <compat_pin_mapping.h> #endif
MyBoardNRF5.h
/* If you don't use an nRF5 board, you can ignore this file. This file was part of the "My Sensors nRF5 Boards" board repository available at https://github.com/mysensors/ArduinoBoards If you have questions, please refer the documentation at https://github.com/mysensors/ArduinoHwNRF5 first. This file is compatible with ArduinoHwNRF5 >= 0.2.0 This file allows you to change the pins of internal hardware, like the serial port, SPI bus or Wire bus. All pins referenced here are mapped via the "g_ADigitalPinMap" Array defined in "MyBoardNRF5.cpp" to pins of the MCU. As an example, if you have at the third position in "g_ADigitalPinMap" the 12, then all ports referenced in Arduino with 2 are mapped to P0.12. If you don't change the "g_ADigitalPinMap" Array, the Arduino pins 0..31 are translated to P0.00..P0..31. ########################################################################### This file is compatible with ArduinoHwNRF5 > 0.1.0 Copyright (c) 2014-2015 Arduino LLC. All right reserved. Copyright (c) 2016 Sandeep Mistry. All right reserved. Copyright (c) 2017 Sensnology AB. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _MYBOARDNRF5_H_ #define _MYBOARDNRF5_H_ #ifdef __cplusplus extern "C" { #endif // __cplusplus // Number of pins defined in PinDescription array #if defined(NRF52840) #define GPIO_COUNT 2 #define PINS_COUNT (48u) #define NUM_DIGITAL_PINS (48u) #define NUM_ANALOG_INPUTS (8u) #define NUM_ANALOG_OUTPUTS (8u) #else #define GPIO_COUNT 2 #define PINS_COUNT (32u) #define NUM_DIGITAL_PINS (32u) #define NUM_ANALOG_INPUTS (8u) #define NUM_ANALOG_OUTPUTS (8u) #endif /* * LEDs * * This is optional * * With My Sensors, you can use * hwPinMode() instead of pinMode() * hwPinMode() allows to use advanced modes like OUTPUT_H0H1 to drive LEDs. * https://github.com/mysensors/MySensors/blob/development/drivers/NRF5/nrf5_wiring_constants.h * */ //#define PIN_LED1 (13) //#define PIN_LED2 (24) //#define PIN_LED3 (5) // #define PIN_LED4 (27) // #define PIN_LED5 (12) // #define PIN_LED6 (14) // #define PIN_LED7 (15) // #define PIN_LED8 (16) // #define USER_LED (PIN_LED2) //#define RED_LED (PIN_LED1) //#define GREEN_LED (PIN_LED2) //#define BLUE_LED (PIN_LED3) // #define BLE_LED BLUE_LED //#define LED_BUILTIN PIN_LED1 /* * Buttons * * This is optional */ //#define PIN_BUTTON (2) // #define PIN_BUTTON2 (4) // #define PIN_BUTTON3 (5) // #define PIN_BUTTON4 (6) // #define PIN_BUTTON5 (7) // #define PIN_BUTTON6 (8) // #define PIN_BUTTON7 (9) // #define PIN_BUTTON8 (10) //#define AXEL_INT (29) //#define MAGNET_INT (28) //#define GERKON_INT (3) /* * Analog ports * * If you change g_APinDescription, replace PIN_AIN0 with * port numbers mapped by the g_APinDescription Array. * You can add PIN_AIN0 to the g_APinDescription Array if * you want provide analog ports MCU independed, you can add * PIN_AIN0..PIN_AIN7 to your custom g_APinDescription Array * defined in MyBoardNRF5.cpp */ static const uint8_t A0 = ADC_A0; static const uint8_t A1 = ADC_A1; static const uint8_t A2 = ADC_A2; static const uint8_t A3 = ADC_A3; static const uint8_t A4 = ADC_A4; static const uint8_t A5 = ADC_A5; static const uint8_t A6 = ADC_A6; static const uint8_t A7 = ADC_A7; /* * Serial interfaces * * RX and TX are required. * If you have no serial port, use unused pins * CTS and RTS are optional. */ #define PIN_SERIAL_RX (9) #define PIN_SERIAL_TX (10) // #define PIN_SERIAL_CTS (13) // #define PIN_SERIAL_RTS (14) /* * SPI Interfaces * * This is optional * * If SPI is defined MISO, MOSI, SCK are required * SS is optional and can be used in your sketch. */ #define SPI_INTERFACES_COUNT 1 #define PIN_SPI_MISO (15) #define PIN_SPI_MOSI (17) #define PIN_SPI_SCK (20) #define PIN_SPI_SS (22) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; /* * Wire Interfaces * * This is optional */ #define WIRE_INTERFACES_COUNT 2 #define PIN_WIRE_SDA (15u) #define PIN_WIRE_SCL (16u) //#define PIN_WIRE_SDA1 (30u) //#define PIN_WIRE_SCL1 (31u) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; #ifdef __cplusplus } #endif #endif```
-
The nRF51822 has been used successfully in many coin cell applications including beacons, wearable, etc. There were three versions of this device. Only REV 3 silicon is being shipped by Nordic. Any older parts should be avoided. If you are wondering what rev you have there is a chart in the compatibility section on the Nordic Semiconductor website. I would add that If supported by the sensors and such I would suggest looking as some of the newer parts in the nRF52 family. Some have a low membory variant that may work for you too. Using the DC/DC converter you can achieve about 6mA of receive and transmit current and sleep currents in the uA range and nA in power down.
-
@Jokgi for sure , next purchase for me would be the nrf52 series. As with @ghiglie , I too had bought the nrf51822 many years back and they were sitting in the drawer. This lockdown allowed me to discover them and hence I decided to use them.
-
Yes, I'm with @Puneit-Thukral . As soon I get more comfortable I'll buy some new parts: for now, I'm too much n00b ! I still reverse polarities, short circuit solder pads...
-
Resuming my old thread. After killing some 328p (but I still spare one!), I got a fully working "multisensor" . Now it's nRF51 turn:
I'm using a Black Magic Probe, made from a Blue Pill - it has May2020 code, "git pull" shows quite a lots of updates, but I'll keep like that. { Just a note: compile it with "make && make PROBE_HOST=swlink" so you'll be able to use the header! } . I have STLinkV2 clone for backup.
My "setup": imgur.com/a/acT6iOZ
@monte said in Just found a pair of "old" NRF51822-04 ... any good?:
Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.
Sorry @monte, I'm totally n00b . Any link about this?
-
@ghiglie you can try this from my old post: https://forum.mysensors.org/post/92044
I will need to write a firmware for 51822 in few weeks, so maybe I'll have something more polished. The most usefull information you can find on Nordic's forum, you can use snippets of code with arduino and it should work, because NRF5 port contains Nordic's SDK, and thus all functions and macroses, that are mentioned on that forum.
-
@monte said in Just found a pair of "old" NRF51822-04 ... any good?:
@ghiglie you can try this from my old post: https://forum.mysensors.org/post/92044
I will need to write a firmware for 51822 in few weeks, so maybe I'll have something more polished. The most usefull information you can find on Nordic's forum, you can use snippets of code with arduino and it should work, because NRF5 port contains Nordic's SDK, and thus all functions and macroses, that are mentioned on that forum.Thanks @monte! Very intesting. This nRF5 journey is getting quite difficult, programming for Nordic's chips is way harder than what I'm used to. Maybe I'll wait for your sketch!
-
@ghiglie look at this from the point that the more difficult the task the more you will learn by accomplishing it
-
@monte said in Just found a pair of "old" NRF51822-04 ... any good?:
Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.
Sorry @monte, I'm totally n00b . Any link about this?
@monte said in Just found a pair of "old" NRF51822-04 ... any good?:
Though the power bug @Nca78 mentioned is easily bypassed with proper software settings. Just don't rely on built in sleep function, because in case of nfr51822 it doesn't disable all hardware and drains power.
Oh, I know! But I lack time to tinker that much. I've just started on learning on Black Magic Probe and STLink differences and use cases... Maybe I just started the hard way, with a DK it would be, at least, less "pioneeristic".