Arm Cortex M0 + NRF-Funkchip in einem: der NRF51822

Begonnen von rastagandalf, 23 Januar 2018, 21:02:48

Vorheriges Thema - Nächstes Thema

rastagandalf

Hallo zusammen,

bin gerade auf etwas gestoßen was für den ein oder anderen interessant sein könnte.
Hier im Forum habe ich dazu noch nichts gefunden, daher möchte ich den Chip kurz vorstellen.

Es gibt als "Nachfolger" bzw. großen Bruder des NRF24L01(+) den NRF51822.
Zusätzlich zum NRF-Protokoll wie es der NRF24L01(+) spricht kann das gute Stück noch Bluetooth Low Energy und hat einen STM32 (man benötigt wohl einen STM-Programmer) an Bord. I²C, SPI, interner Temperatursensor,... - mehr dazu im Datenblatt auf der verlinkten Herstellerwebsite.

Den Chip gibts aus China für 2...4 € auf einer Platine, zusätzlich findet man sogar ganze Fitness-Tracker mit OLED-Display mit diesem Chip und für 10...15 € gibt es einen ganzen Sensor-Beacon mit Druck-/Temperatursensor, Beschleunigungssensor, Näherungssensor und zwei Tastern sowie Knopfzellenhalter.

Auch interessant: Es gibt für ca. 5 € reine Bluetooth-Beacons ohne Sensorik, aber mit einem Taster. Vielleicht als Taster um Aktionen/Szenen/... zu aktivieren ganz nützlich. Kann sogar sein dass hier ein Gehäuse beiliegt.

Was bringt uns das?
Hier hat jemand wohl schon mal MySensors drauf laufen lassen.
Das ganze ist wohl noch nicht für jedes Board mit Definitionen versehen, ist sicher aber nur eine Frage wie hartnäckig man sich das anschaut (Digitale IOs sollten sich recht einfach finden lassen, I²C für eventuelle Sensorik sollte sowieso mehr oder weniger offensichtlich an die richtigen Pins angebunden sein).

Ich habe mir mal zwei verschiedene Platinen aus Fernost bestellt und werde berichten sobald ich diese hier habe.

Was meint Ihr? Ich halte den Chip für eine praktische und günstige Alternative zum klobigen Arduino Pro Mini mit den bisherigen NRF24L01(+)-Boards.

Viele Grüße
Timo

tiwo85

Ist ja lustig,
Ich bin auch gerade an dem Thema dran. Ich habe auf Openhardware.io folgendes gefunden https://www.openhardware.io/view/510/Multi-Sensor-TempHumidityPIR-LeakMagnetLightAccel und mir dementsprechend noch passende PCBs und Vogelfutter sowie Nrf51822-04 bestellt.
Einen NRF51822 BLE4.0 habe ich auch bereits erfolgreich nach folgendem Video ins Mysensors Netzwerk einbinden können. https://youtu.be/QScTnXXBG9I

Es sei noch dazu gesagt, das der NRF51822 kein STM32 ist sondern ein Arm Cortex M0 Kern besitzt.

Gesendet von meinem VKY-L09 mit Tapatalk


Ranseyer

Die ID107  ist ne sehr schicke HW-Plattform... Aber: unklar wie sauben öffnen und wieder schliessen? Roger Clarc hat seine wohl gebrickt...

Ich werde mal weiter hier mitlesen. (Bei NRF2401 bin ich eigentlich raus)
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

Beta-User

Es gibt zu den nRF51822 auch einen (leider ellenlangen) Thread bei MySensors: https://forum.mysensors.org/topic/6961/nrf5-bluetooth-action/57.

Scheint grundsätzlich zu laufen, wenn ich den (lose überflogenen) Thread richtig verstanden habe (ich habe damit aber keine Erfahrung).

Gibt auch schicke mini-Platinen mit dem Teil.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

PeMue

Zitat von: Beta-User am 24 Januar 2018, 17:19:16
Gibt auch schicke mini-Platinen mit dem Teil.
Da ich heute sowieso bestellt in China habe, habe ich mir für ein halbes Bier eines dieser Teile mitbestellt  ;)
Wer also mal Bedarf haben sollte, kurze Info an mich.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

tiwo85

Ich habe heute früh die erste Nrf5 Node in Betrieb genommen.
Als Basis habe ich die Platinen aus diesem Thread von Mysensors.org bestellt. https://www.openhardware.io/view/510/Multi-Sensor-TempHumidityPIR-LeakMagnetLightAccel
Den Sketch habe ich umgebogen auf die interne Temperatur. Somit entfällt vorerst der externe Temperatursensor.
Gesendet wird alle 3 Minuten. Wobei ich mir nicht sicher bin, ob es wirklich 3 Minuten sind. Ich habe als Board das Waveshare BLE4.0 ausgewählt, da Generic Nrf51 sowie MyBoardNrf5 nicht funktionieren, bzw. der Oscillator nicht richtig gewählt wird.
Mal schauen, wie lange die Batterie hält. Screenshots und weitere Bilder sowie der Sketch folgen. (https://uploads.tapatalk-cdn.com/20180201/18b8564f100d985847d1400d0474ae84.jpg)

Gesendet von meinem VKY-L09 mit Tapatalk


rastagandalf

Moin!

Von meinen ist jetzt der erste auch gekommen, der gleiche wie der den tiwo85 auf seiner Platine hatte...
Zitat von: tiwo85 am 02 Februar 2018, 00:17:37
Als Basis habe ich die Platinen aus diesem Thread von Mysensors.org bestellt. https://www.openhardware.io/view/510/Multi-Sensor-TempHumidityPIR-LeakMagnetLightAccel
Gibts da noch eine die Du mir per Briefumschlag für entsprechendes Porto + Einzelpreis übrig hättest? ;-)
Hast Du den Code für den internen Sensor irgendwo fertig gefunden?

Zitat von: tiwo85 am 02 Februar 2018, 00:17:37
Mal schauen, wie lange die Batterie hält. Screenshots und weitere Bilder sowie der Sketch folgen.
Hält sie bisher noch? Oder musstest Du schon fleißig wechseln? ;-)

Bin mal gespannt wie gut das mit I²C-Sensorik klarkommt...

tiwo85



Zitat von: rastagandalf am 09 Februar 2018, 12:58:18
...Gibts da noch eine die Du mir per Briefumschlag für entsprechendes Porto + Einzelpreis übrig hättest? ;-)
...
Ich schreib dir heute abend, wenn ich zu Hause bin.

Zur Zeit läuft sie noch. Überträgt alle 3 Minuten Spannung und Temperatur. Also eigentlich 1 Übertragung, Batterie in Variable schreiben, 1 Minute warten, Batterie senden, 2 Miuten warten. Eigentlich viel zu viel. Die Abstände können noch weiter auseinander sein, also 1 Übertragung, Batterie auslesen, Batterie senden und dann 5 oder 10 Minuten Pause. Zur Zeit ist die Cr2032 bei ca 2,8V von anfangs 3v Ich hab sie aber aus Versehen am Anfang für einen Bruchteil einer Sekunde kurz geschlossen. Alternativ hätte ich noch eine 2450 liegen.





Gesendet von meinem VKY-L09 mit Tapatalk


tiwo85

So, hier nochmal eine kleine Übersicht:

Wie etwas weiter oben bereits beschrieben, nutze ich die Platinen von hier:
https://www.openhardware.io/view/510/Multi-Sensor-TempHumidityPIR-LeakMagnetLightAccel#tabs-comments
und
https://www.openhardware.io/view/420/AM612-Passive-Infrared-Sensor-Breakout-Board

nutzen tue ich diese mit der Mysensors Bibliothek. Beschrieben wird das ganze hier:
https://www.openhardware.io/view/376/MySensors-NRF5-Platform

Als Sketch habe ich den Beispielsketch von den ersten Platinen genommen und ein wenig abgeändert.
TemperatureNode.ino
// SUMMARY: This demo sketch runs on MultiSensor Version 7 board with an I2C Si7021 module to transmit temperature, humidity, and battery voltage to a MySensors gateway using MySensors protocols.


/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2017 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* 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.
*
*******************************
*
* REVISION HISTORY
* Version 1.0 - tekka
*
* DESCRIPTION
* Passive node example: This is a passive & independent reporting node
*
*/

// This demo sketch uses the LowPowerLab SI7021 library and also some of its sample code:  https://github.com/LowPowerLab/SI7021

// This demo sketch also draws from the MySensor's example MockMySensors sketch.

// This demo sketch also draws from some of the code posted by smilvert here: https://forum.mysensors.org/topic/7961/why-do-passive-nodes-need-to-set-their-node-id-manually/14


#define SHORT_WAIT 50

#include <Wire.h>


// Enable debug prints
#define MY_DEBUG

// Enable passive mode
#define MY_PASSIVE_NODE

#define MY_NODE_ID 51

#define PIN_LED1                (1)
#define LED_BUILTIN          PIN_LED1


// Enable and select radio type attached
//#define MY_RADIO_NRF24
#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95

#include <MySensors.h>

#define CHILD_ID_TEMP 1  //definitions contributed by smilvert (see above credit)


// Initialize general message
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);


#define ID_S_MULTIMETER        28
#include "nrf_temp.h"

/*
* brief    Funktion liest den Temperaturwert vom internen Temperatursensor von nRF51822
* return   Wert der Temperatur(float)
*/
float read_temp_value(){

  float temp=0;

  /* Starten Sie die Temperaturmessung. */
  NRF_TEMP->TASKS_START = 1;

  /* Warten Sie, bis die Temperaturmessung abgeschlossen ist.*/
  while (NRF_TEMP->EVENTS_DATARDY == 0){
    // Do nothing.}
  }
  NRF_TEMP->EVENTS_DATARDY = 0;

  /* Lesen Sie den Temperaturwert vom Sensor ab
   * Die Genauigkeit beträgt 0,25 Grad Celsius <=> 1 Einheit = 0,25 Grad Celsius
   * Teile durch 4, um einen C-Wert zu erhalten
   */
  temp = ((float)nrf_temp_read() / 4.);

  /* Hoàn thành quá trình đo. */
  NRF_TEMP->TASKS_STOP = 1;

  return temp;
}

MyMessage msg_S_MULTIMETER_V_VOLTAGE(ID_S_MULTIMETER,V_VOLTAGE);

float batteryVoltage=0; 



void blinkityBlink(uint8_t repetitions) {
  for (int x=0;x<repetitions;x++) {
    digitalWrite(LED_BUILTIN,HIGH);
    wait(20);
    digitalWrite(LED_BUILTIN,LOW);
    wait(100);
    digitalWrite(LED_BUILTIN,HIGH);
    wait(20);
    digitalWrite(LED_BUILTIN,LOW);   
    if (x<(repetitions-1)) {  //skip waiting at the end of the final repetition
      wait(500);
    }
  }
}



void setup()
{
      pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  blinkityBlink(5);  //signify power-up and start of operations

    nrf_temp_init();
 
  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

}

void presentation()
{
// Send the sketch version information to the gateway and controller
sendSketchInfo("Temp node", "1.0");

  // Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID_TEMP, S_TEMP,"Onboard Temperature");
  wait(SHORT_WAIT);
  present(ID_S_MULTIMETER,S_MULTIMETER,"Electric Station");
  wait(SHORT_WAIT);
}


void loop() {

    // get humidity and temperature in one shot, saves power because sensor takes temperature when doing humidity anyway

digitalWrite(LED_BUILTIN,LOW);

    sleep(60000);  //sleep for one minute to recover voltage after temperature and humidity measurements.
    blinkityBlink(1);
    send(msgTemp.set(read_temp_value(),2));
    batteryVoltage=((float)hwCPUVoltage())/1000.0;  //take voltage measurement after transmission to hopefully measure lowest voltage that occurs.
    sleep(60000);  //sleep for one minute
    blinkityBlink(1);
    send(msg_S_MULTIMETER_V_VOLTAGE.set(batteryVoltage,3));  //send battery voltage with 3 decimal places
    sleep(60000);  //sleep for 60 seconds
}


nrf_temp.h:
/*
* Copyright (c) Nordic Semiconductor ASA
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
*   1. Redistributions of source code must retain the above copyright notice, this
*   list of conditions and the following disclaimer.
*
*   2. Redistributions in binary form must reproduce the above copyright notice, this
*   list of conditions and the following disclaimer in the documentation and/or
*   other materials provided with the distribution.
*
*   3. Neither the name of Nordic Semiconductor ASA nor the names of other
*   contributors to this software may be used to endorse or promote products
*   derived from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

#ifndef NRF_TEMP_H__
#define NRF_TEMP_H__

#include "nrf.h"

/**
* @defgroup nrf_temperature TEMP (temperature) abstraction
* @{
* @ingroup nrf_drivers temperature_example
* @brief Temperature module init and read functions.
*
*/

/**@cond NO_DOXYGEN */
#define MASK_SIGN           (0x00000200UL)
#define MASK_SIGN_EXTENSION (0xFFFFFC00UL)

/**
* @brief Function for preparing the temp module for temperature measurement.
*
* This function initializes the TEMP module and writes to the hidden configuration register.
*/
static __INLINE void nrf_temp_init(void)
{
    /**@note Workaround for PAN_028 rev2.0A anomaly 31 - TEMP: Temperature offset value has to be manually loaded to the TEMP module */
    *(uint32_t *) 0x4000C504 = 0;
}

/**
* @brief Function for reading temperature measurement.
*
* The function reads the 10 bit 2's complement value and transforms it to a 32 bit 2's complement value.
*/
static __INLINE int32_t nrf_temp_read(void)
{   
    /**@note Workaround for PAN_028 rev2.0A anomaly 28 - TEMP: Negative measured values are not represented correctly */
    return ((NRF_TEMP->TEMP & MASK_SIGN) != 0) ? (NRF_TEMP->TEMP | MASK_SIGN_EXTENSION) : (NRF_TEMP->TEMP);   
}
/**@endcond */

/** @} */

#endif


Definitionen in FHEM:
define MYSENSOR_51 MYSENSORS_DEVICE 51
attr MYSENSOR_51 IODev gateway
attr MYSENSOR_51 mapReading_current28 28 current
attr MYSENSOR_51 mapReading_id1 1 id
attr MYSENSOR_51 mapReading_impedance28 28 impedance
attr MYSENSOR_51 mapReading_temperature1 1 temperature
attr MYSENSOR_51 mapReading_voltage28 28 voltage
attr MYSENSOR_51 mode node
attr MYSENSOR_51 offset -2.5
attr MYSENSOR_51 room System->Systeme->MySensors
attr MYSENSOR_51 stateFormat {"T:".sprintf("%.2f"."°C",ReadingsVal($name,"temperature",0))." B:".sprintf("%.1f"."V",ReadingsVal($name,"voltage28",0))}
attr MYSENSOR_51 userReadings temperature {my $v = ReadingsVal($name,"temperature1","error")+AttrVal($name,"offset","");;;; $v;;;;}
attr MYSENSOR_51 version 2.2.0
define FileLog_MYSENSOR_51 FileLog ./log/MYSENSOR_51-%Y.log MYSENSOR_51
attr FileLog_MYSENSOR_51 room System->Daten->Log-Daten
define SVG_FileLog_MYSENSOR_51_1 SVG FileLog_MYSENSOR_51:SVG_FileLog_MYSENSOR_51_1:CURRENT
attr SVG_FileLog_MYSENSOR_51_1 label "EG Bad Min $data{min2}, Max $data{max2}, Last $data{currva2}, Bat Min$data{min1}, Max $data{max1} "
attr SVG_FileLog_MYSENSOR_51_1 room System->Daten->Plots


Anbei noch ein Plot und ein Bild vom Sensor. Die Buchse habe ich zur Zeit nicht aufgötet, weil mir der Adapter vom RM1,27 auf 2,54 fehlt für den ST-Link zum programmieren.

tiwo85

Update:
Weitere 14 Tage später funkt der kleine NRF51822 weiterhin. Die Spannung beträgt nur noch 2,5V, aber er schlägt sich weiterhin tapfer.

Den Bewegungsmelder habe ich bis dato noch nicht zum Laufen gekriegt, hier hapert es noch mit den Interrupts.

tiwo85

#10
Irgendwie hat das mit dem upload nicht funktioniert. (https://uploads.tapatalk-cdn.com/20180227/c4a8b6bfc51f71756db1e9f079a7ca6e.jpg)

Gesendet von meinem Huawei P10 Plus mit Tapatalk


rastagandalf

Moin!
Zitat von: tiwo85 am 27 Februar 2018, 08:06:04
Den Bewegungsmelder habe ich bis dato noch nicht zum Laufen gekriegt, hier hapert es noch mit den Interrupts.
Hast Du Dir das schon mal angesehen zu dem Thema?

Deine Platinchen sind übrigens heil angekommen, danke nochmal :) Jetzt muss ich nur noch dazu kommen die auch zu verwenden...

tiwo85



Zitat von: rastagandalf am 27 Februar 2018, 20:58:08
Moin!Hast Du Dir das schon mal angesehen zu dem Thema?
...
Das habe ich schon versucht. Ich habe das Problem, das der NRF51822 nicht richtig weiterläuft im Zusammenspiel mit der mysensors lib. Sie HIER


Gesendet von meinem Huawei P10 Plus mit Tapatalk