Grote hoeveelheden data op een Arduino: gebruik een SD-kaart (wiki). Deze SD kaart kan je dan ook gewoon in je laptop of PC plaatsen en daar vervolgens formatteren, beschrijven of uitlezen.
- BELANGRIJK voor Arduino
|
- Geen modules, tenzij noodzakelijk
Koop geen module als u kunt solderen. Maak simpel zelf een adapter (voorbeeld) om je SD kaart aan te sluiten. Die is volslagen overbodig en leidde hier enkel tot extra problemen. Met een Arduino kan je een SD kaart rechtstreeks op de Arduino aansluiten.
- Voedingsspanning
De voedingsspanning bedraagt: 3,3Vdc. 5Vdc als voedingsspanning zal uw kaartje hoogstwaarschijnlijk slopen. De communicatie pins kunnen in de praktijk wel rechtstreeks op een Arduino kunnen worden aangesloten. En in mijn testgevallen werkt de SD kaart aan een UNO zelfs enkel met een 5Vdc voeding.
- Niet alle soorten
Het mag uitsluitend een Standard Capacity SD kaartje of een SDHC kaartje zijn. Dit komt doordat de SD.h bibliotheek (Arduino.cc) geen grotere kaarten aankan. Het werkt met FAT16 en dat kan niet meer aan dan 2 Gb. Dat is voor een robot heel veel en FAT16 is zeer compatibel.
|
- Soorten kaarten
|
- Type SD standaard
SDSC, SDHC, SDXC, SDUC.
- Formaat
- Standaard SD formaat
Werd in eerste instantie veel in foto camera`s gebruikt en is de open-standaard opvolger van de MMC kaart (wiki). MMC werkt wel in een standaard SD slot, maar standaard SD werkt niet in een MMC slot. Standaard SD is nu nog terug te vinden in bijna alle PC`s, laptops en printers etc. Er bestaan conversie SD kaartjes met de maat van een standaard SD kaart die ook in een computer passen. Het micro SD kaartje kan dan in de conversie SD kaart worden gestoken. Dit zal voor de meeste Arduino gebruikers de ideale oplossing blijken te zijn.
- Mini SD formaat
Vrijwel uitgestorven, maar ook hier bestaan conversie kaartjes voor zodat de mini SD kaartjes ook in een standaard SD slot passen.
- Micro SD
Bedoeld voor telefoons. Er bestaan conversie SD kaartjes met de maat van een standaard SD kaart die ook in de computer past. Het micro SD kaartje kan dan in de conversie SD kaart worden gestoken.
- Capaciteit
SD kaartjes bestaan in vele capaciteiten maar voor een Arduino heeft groter dan 2 Gig geen zijn.
|
- Aansluitingen
|
Zie bijvoorbeeld ook: dharmanitech.com..
- Solderen
On a Arduino Mega the SPI connections are: 50=MISO, 51=MOSI, 52=SCK and 53=CS. MISO = oranje
MOSI = geel
CS = groenAn Arduino library for SD cards can be found at Arduino Reference. To be able to use the examples on an Arduino Mega board you only have to change the chipSelect pin. I use a 2Gb micro card in a adapter SD card.
- Voedingsspanning
3,3Vdc
|
- Bibliotheken
|
- SD.h
Arduino.cc beschrijft de SD.h bibliotheek (github). Maar daar hoeft niets voor te gebeuren want deze is standaard al geïnstalleerd in de Arduino IDE.
- SdFat.h
Deze bibliotheek is standaard al geïnstalleerd in de Arduino IDE. Hij is uitgebreider want je kunt er ook SD kaartjes mee formatteren.
|
- Eerste gebruik
|
- Formatteren
SD cards must be formatted with a file system before you can use them, just like a hard-disk. They may be formatted with the FAT (=FAT16) or FAT32 file system (FAT16vsFAT32). The library supports the FAT16 and FAT32 file systems, but use FAT16 when possible (source). That leaves effectively 1,881 Mb on my 2Gb card. Since it is a file system we will have to write our measured data to a file.
Gebruik Fat16 (wiki) volgens Arduino.cc. Of First, the SD standard specifies that 2GB and smaller cards should be formatted FAT16 and very small cards are FAT12. Cards larger than 2GB must be FAT32 (volgens https://forum.arduino.cc/index.php?topic=128875.0)
The Official SD Association Formatter an Windows utilities will not format cards larger than 32GB as FAT32. Use the SdFat SdFormatter example, it will produce a FAT32 format that can be used on both the Arduino and PC. (https://forum.arduino.cc/index.php?topic=357127.0)
The max size is 32 GB for standard SDHC micro cards. Both SdFat and SD.h support this size. SdFat can use larger micro SDXC cards format as FAT32. 64 GB micro SDXC cards are available. (https://forum.arduino.cc/index.php?topic=205883.0)https://vmspot.com/format-fat16-usb/
sudo fdisk -l
geeft o.a. /dev/mmcblk0
Onder Linux: Apps / Utilities / Disks
Geformateerd daar met een grootte van 1,8 gig.
official site Windows formatter
Met deze library kan je formatteren vanaf een Arduino.
Uiteindelijk gewoon de voeding in 5Vdc gestoken en het geheel werkt.
|
- Werking
|
- SPI
They all use SPI to communicate, but the size and speed will vary.
|
//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 ----------------------
?>