- Ping en Pong
| |
- Hello world NRF24L01+
|
|
- LoRa introductie
|
LoRa (Long Range) (wiki) is het smalle band IoT zender/ontvanger systeem dat werkt met een gering vermogen. maar toch over een grote afstand (tot 10km). Lora is de naam van de gebruikte zendtechniek die is gebaseerd op de spread spectrum techniek, uitgevonden door Semtech en opgenomen in het Larta forum. In Europa is de frequentie 868 MHz. Lora heeft altijd een gateway nodig. De gateway is het basisstation en is vaak ook verbonden met het internet. Er zijn meerdere mogelijkheden om LoRa te implementeren:
- 1) KPN IoT
KPN noemt zijn LoRa oplossing KPN internet of things. Dit is 1 van de simpelste mogelijkheden om met LoRa te werken.
- 2) LoraWan TTN
Als je niet afhankelijk wilt zijn van 1 eigen gateway maar gebruik wilt maken van een dekkend landelijk netwerk dan moet je zorgen dat jouw nodes zich kunnen verbinden met 1 van de bestaande netwerken. Dit wordt LoraWan (wiki) genoemd. Er bestaan meerdere commerciële netwerken waarvoor je moet betalen voor een abonnement net als bij je telefoon, bijvoorbeeld van KPN. Er bestaat echter ook 1 gratis netwerk dat geen abonnementskosten vraagt: The Things Network. Dit kan NIET met ieder type lora transceiver. Zie verder bij LoraWan.
- 2) Peer to Network
De volgende stap is het ombouwen van 1 van de bovenstaande nodes zodat deze verbinding met het internet maakt. Deze node wordt dan in LoRa termen een Gateway genoemd. Je kan dan met 1 gateway verschillende nodes binnen een straal van 10 km met het internet verbinden. Dit kan met ieder type lora transceiver.
- 1) Peer to peer
In deze situatie worden er 2 apparaten (peers) die ieder zowel zender alsook ontvanger (transceivers) zijn, via Lora met elkaar verbonden. In Lora termen worden dit soort apparaten "nodes" genoemd. Dit kan worden uitgevoerd met ieder type Lora transceiver. Zie verder bij Hello World.
|
- LoraWan
|
Er bestaan meerdere mogelijkheden om een LoraWAN (wiki) op te zetten, zie bij Lora introductie. Wij gaan voor The Things Network omdat het open-source is en geen abonnementskosten kent.
- Hardware compatibel?
Allereerst moet je uitzoeken of je hardware compatibel is met LoraWan. Lang niet alle Lora hardware kan worden gebruikt voor LoraWan. Zo zijn de NRF24L01+ niet compatibel maar bijvoorbeeld de Antratek modules wel.
- Netwerkdekking
Vervolgens moet je uitzoeken of je binnen het bereik van een bestaande TTN-gateway valt. Indien niet dan moet je zelf een gateway installeren. Je kan op de zogenaamde TTN-Heatmap zien of er een gateway voldoende dicht in de buurt zit. In Nederland is dat bijna altijd het geval. Hoe weet ik zeker of ik hier bereik heb op het TTN netwerk?
- Communicatievorm
Je kan wel data naar de node zenden maar deze data wordt uitsluitend naar de node gezonden nadat de node zelf iets naar het netwerk heeft gezonden. Zo hoeft het netwerk niet te pollen.
|
- Aansluitingen NRF24L01+
|
- Juiste aansluitingen
Het blijkt dat alles in Hello World correct werkt zodra de CE=10 en de CSN=9 worden aangesloten op een Arduino. Het lijkt er dus op dat er niet helemaal juist gewerkt wordt met de SPI bibliotheek. Dat is iets dat ik al veel vaker heb zien gebeuren in sketches, al in assembler. Vreemd vreemd vreemd. Het blijkt niets uit te maken of ik ping nu aanzet of niet. Het lijkt wel uit te maken als ik ping aanzet en mijn vingers op de voedingsspanning hou. Waarom loopt Pong door? Wat onvangt hij? Dat blijkt te komen doordat hij continu doet alsof hij iets ontvangt vanwege onjuiste SPI aansluitingen.
- pinMode(CE_PIN, OUTPUT); pinMode(CSN_PIN, OUTPUT);
Dit lijkt weinig uit te maken. er lijken iets minder: Error failed radio boodschappen te ontstaan als beiden aanstaan. Maar stabiel is het geheel nog niet.
- Voeding
De voedingsspanning mag maximaal 3,3Vdc zijn maar de rest van de pennen mag op 5Vdc worden aangesloten.
- Aansluitdraden
Deze tranceivers communiceren door middel van SPI. Buiten de 3 pennen benodigd voor SPI, zijn er nog 2 extra pennen nodig voor Chip Enable en Chip Select Not. Default worden deze pennen voorgeschreven, maar op de Arduino moet je 9 en 10 gebruiken in plaata van 7 en 8. Zorg dat pin 10 (op de UNO) de CE is. Het blijkt dat alles in Hello World uitsluitend correct werkt zodra de CE=10 en de CSN=9 worden aangesloten op een Arduino Uno. Het lijkt er dus op dat er niet helemaal juist gewerkt wordt met de SPI bibliotheek. Dat is iets dat ik al veel vaker heb zien gebeuren in sketches, vooral in assembler. If you are using pins other than 10 and 9 for CSN and CE you must still set pin 10 for OUTPUT to ensure that the Uno acts as the SPI master.
- CE
CE (Chip Enable = 10) is an active-HIGH pin. When selected the nRF24L01 will either transmit or receive, depending upon which mode it is currently in.
- CSN
CSN (Chip Select Not = 9) is an active-LOW pin and is normally kept HIGH. When this pin goes low, the nRF24L01 begins listening on its SPI port for data and processes it accordingly.
RF24 | Arduino | sketch | kleur |
SCK | 13 | SCK | oranje |
MSIO | 12 | MISO | geel |
MOSI | 11 | MOSI | groen |
CE | 10 | ce_pin | paars |
CSN | 9 | cs_pin | wit |
How nRF24L01+ Wireless Module Works & Interface with Arduino |
//This is an include, so no parsing needed
$qry2 = ("SELECT onderdelen.*,
soortonderdeel.id
FROM onderdelen
JOIN soortonderdeel ON onderdelen.idsrtodd = soortonderdeel.id
WHERE onderdelen.partid = $idpart
;");
$result2 = pg_query($con1, $qry2);
$row4 = pg_fetch_array($result2); //Make the fields accesible
foreach( $row4 AS $key => $val ){
$$key = stripslashes( $val );
}
$jaar = substr($changeddate,0,4);
$maand = substr($changeddate,5,2);
$dag = substr($changeddate,8,2);
$lastupdate = ("$jaar $maand $dag");
$prtsrttxt = get_txt($con1, 26, 1, $idsrtodd);
$jaar = substr($createddate,0,4);
$maand = substr($createddate,5,2);
$dag = substr($createddate,8,2);
$create_stamp = ("$dag $maand $jaar");
//GENERAL INFO FOR EVERY USER **************************************************
echo (" ");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3923); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo (" (edit)");
}
echo ("Algemene informatie test | ");
if ($codetext) { //Code like KY-026 or NA-41
echo ("");
$tmp = get_txt($con1, 9, $koekje[2], 3739); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //Class for colour
}else{ //So you are not allowed to translate
echo $tmp; //Show screenname of this field in user language
} //End of If you want to translate this fieldname at screen
echo ("  | ");
if ($codelink) {
echo ("$codetext");
}else{
echo ("$codetext");
} //End of if ($pinoutlink)
echo (" | ");
} //End of if ($codetext)
$tmp = get_txt($con1, 9, $koekje[2], 3741); //Fieldname at screen
if ($prijseurinclbtw > 0){ //Show price indication
$prijs_formatted = number_format($prijseurinclbtw / 100, 2, ',', '.');
echo ("$tmp   | ");
echo ("");
if ($urlprijs){
echo ("€  $prijs_formatted");
}else{
echo ("€  $prijs_formatted");
} //End of if ($urlprijs > "")
echo (" | ");
} //End of if ($prijseurinclbtw > 0)
if ($sketchtext) { //Link to OWN SOFTWARE
$tmp = get_txt($con1, 9, $koekje[2], 3738); //Fieldname at screen
echo ("$tmp   | ");
if ($sketchlink) {
echo ("$sketchtext");
}else{
echo ("$sketchtext");
} //End of if ($sketchlink)
echo (" | ");
} //End of if ($sketchtext)
$tmp = get_txt($con1, 9, $koekje[2], 3744); //Fieldname at screen
if ($pinouttext) { //Pinout
echo ("$tmp   | ");
if ($pinoutlink) {
echo ("$pinouttext");
}else{
echo ("$pinouttext");
} //End of if ($pinoutlink)
echo (" | ");
}
$tmp = get_txt($con1, 9, 1, 3735); //Fieldname at screen
$tmp2 = get_txt($con1, 26, 1, $row4[16]); //Group name in its language
echo ("$tmp   | "); //MENU GROUP
echo ("");
echo ("$tmp2 | ");
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$tmp = get_txt($con1, 9, $koekje[2], 3918); //Fieldname at screen LANGUAGE
if ($row4[26] == 1) {$imgname = "nederland.png";}
if ($row4[26] == 2) {$imgname = "deutschland.png";}
if ($row4[26] == 3) {$imgname = "uk.png";}
if ($row4[26] == 4) {$imgname = "france.png";}
echo ("$tmp | ");
echo ("");
echo (" | ");
$tmp = get_txt($con1, 9, $row4[27], 3919); //Fieldname at screen
$statuskey = get_status_key($con1, $status);
$tmp2 = get_txt($con1, 61, $koekje[2], $statuskey); //Fieldname at screen
echo ("$tmp   | "); //STATUS
echo ("$status $tmp2 | ");
}
$tmp = get_txt($con1, 9, 1, 3966); //Fieldname at screen
echo ("$tmp   | "); //LAST CHANGED
$tmp = substr($changeddate, 0, 10);
echo ("$tmp | ");
echo (" ");
return;
////////////////////////////////////////////////////////////////////////////////
function get_status_key($con, $num){
$qry = ("SELECT id FROM status WHERE nr = $num ;");
$result = pg_query($con, $qry);
$row = pg_fetch_array($result);
return ("$row[0]");
}
// LIST ALL SOFTWARE THAT WILL RUN OM THIS PART *****************************
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry2=("SELECT tblsystext.txtname
, software.urlmain
, software.sftname
, software.sftid
, software.controller
FROM software
LEFT JOIN tblsystext ON software.controller = tblsystext.recordid
WHERE position(' $idpart ' in software.prtlst) > 0
AND software.rstid = 2
AND tblsystext.lanid = $koekje[2]
AND tblsystext.txlid = 19
ORDER BY sftname ASC
, controller ASC
;");
$result = pg_query($con1, $qry2);
if (pg_num_rows($result)>0) { //Only if at least 1 program exists
echo (' ');
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3922); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" |
---|
");
while($col = pg_fetch_array($result)){
$col[0] = ("$col[0]");
echo (" ");
echo ("$col[2]   | ");
echo ("$col[0] | ");
if ($koekje[0] > 0 and $koekje[3]>0){ //User is logged in and translates
echo ("");
echo ("(Edit) | ");
}
echo (' ');
}
echo (' ');
}
?>
// LIST ALL ROBOTS THAT INCLUDE THIS PART ***********************************
// $idpart
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry_bpp=("SELECT farmbotversie.id
, farmbotversie.part_list
, tblsystext.txtname
FROM farmbotversie
LEFT JOIN tblsystext ON farmbotversie.id = tblsystext.recordid
WHERE tblsystext.txlid = 27
AND tblsystext.lanid = $koekje[2]
ORDER BY tblsystext.txtname ASC
;");
$result_bpp = pg_query($con1, $qry_bpp);
$header = 0;
while($colbpp = pg_fetch_array($result_bpp)){ //Only if at least 1 robot exists
if(substr_count($colbpp[1], " $idpart ") > 0){
if ($header == 0) {
echo ("");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3879); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" | ");
$header++;
} //End of if ($header == 0)
echo ("");
echo ("$colbpp[2]");
//Show software van deze bot
$qry=("SELECT software_basedir
FROM farmbotversie
WHERE id = $colbpp[0];");
$result = pg_query($con1, $qry);
$col = pg_fetch_array ($result ,0);
$dir1 = "/var/www/html/robotigs/software/$col[0]";
$arr1 = glob($dir1, GLOB_ONLYDIR);
if (isset($arr1[0])){
$folder = $arr1[0];
$countertmp = 0;
echo ("");
foreach (scandir($folder, 1) as $filename) {
if ($filename<>"." AND $filename <>".."){
if ($countertmp == 0){
$countertmp++;
} //End of if ($countertmp == 0)
$tmp = "/";
$dir = substr($folder, 14) ."/";
$link = $tmp .$dir .$filename;
$showname = substr($filename, 0 ,-4);
echo ("- ");
echo "$showname";
echo ("
");
} //End of if ($filename<>"." AND $filename <>".."){
} //End of foreach (scandir($folder, 1) as $filename)
echo ("");
} //End of if (isset($arr1[0]))
echo (" | ");
}
}
if ($header > 0){
echo (" ");
}
?>
Warning: include(/var/www/html/robotigs/includes/wishlistperpart.php): Failed to open stream: No such file or directory in /var/www/html/robotigs/includes/parts_header.php on line 128
Warning: include(): Failed opening '/var/www/html/robotigs/includes/wishlistperpart.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/robotigs/includes/parts_header.php on line 128
| //Location:/robotigs/includes/ picts_show.php
// Requieres: $pict_list and several picture handling javascript routines
//*** FROM HERE ON THE PICTURE CORNER STARTS -----------------------------------
if ($pict_list){ //There are 1 or more pictures to be printed
echo ("");
$counter = 0;
$aantal = str_word_count($pict_list, 0, "0123456789");
$lijst = str_word_count($pict_list, 1, "0123456789");
while($counter < $aantal){
$pictkey = $lijst[$counter];
$qryy1 = ("SELECT *
FROM illustrations
WHERE ill_id = $pictkey
;");
$resulty1 = pg_query($con1, $qryy1);
while($row = pg_fetch_array($resulty1)){ //Fields accesible by their name
foreach( $row AS $key => $val ){
$$key = stripslashes( $val );
}
}
$image = ("/robotigs/documentatie/plaatjes/$ill_name");
$pictfull = str_replace('_small', '', $image); //Pictfull=biggest version
$alt = ("Just wait till your 57....");
$txtname = get_txt($con1, 18, $koekje[2], $ill_id); //Robot illustrations subtitles
echo ("");
echo (' ');
$nummer = $counter + 1;
$txtAfb = get_txt($con1, 9, $koekje[2], 3865); //Pic Afb
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo ("$txtAfb $nummer: ");
echo ("$txtname");
echo (" ");
echo ("Ontkoppelen ");
if ($counter==0){
echo ("Up ");
}else{
echo ("Up ");
}
if ($nummer == $aantal){
echo ("Down");
}else{
echo ("Down");
}
}else{ //Else of if Meaning the current useer is logged in
echo ("$txtAfb $nummer: $txtname");
}
echo (''); //End of this picture
$counter++; //Prepair for next picture
}
echo (' | '); //All pictures are printed
} //End of if there are 1 or more pictures to be printed ----------------------
?>