In System Programming (Wiki). betekent dat µcontrollers in de schakeling kunnen worden geprogrammeerd. Dit is voor roboteers een ideale uitvinding. Het is vooral gemakkelijk voor testen of updaten van de software.
- Communicatieproblemen
|
- Linux Arduino USB Port
De Arduino wordt geprogrammeerd met een USB kabel. De USB poort heet ACM01 or ttyUSB etc. Deze poorten zijn allemaal lid van de groep dialout. Deze groep heeft alle benodigde rechten om onder Linux deze poort te mogen gebruiken. Dus maak iedereen die een Arduino wil programmeren lid van deze groep met:
sudo adduser $USER dialout.
sudo usermod -a -G dialout loginname.
Een reboot is nodig.
- Linux Arduino USB Port 2
De USB poort is ineens niet meer zichtbaar bij het programmeren van Boldermin. Onder Windows is de robot wel degelijk bereikbaar onder COM3.
Ubuntu Arduino USB port invisible
|
WAARSCHUWING Als alles goed gaat kunt u straks uw µcontroller programmeren. Tot nu toe heeft u nog weinig kansen gehad om µcontrollers te slopen, behalve dan dat u ze in verkeerde voetjes heeft gestoken, of met het nokje naar de verkeerde kant. Dat gaat nu veranderen. Tijdens het programmeren heeft u de mogelijkheid om met 1 druk op de knop een controller definitief onbruikbaar maken. Vandaar de uitdrukkelijke waarschuwing om tijdens het programmeren niets te doen waarvan u niet zeker weet dat u het moet doen. Ga hier niet lukraak iets zitten proberen en zeker niet met de Fuses en Lock Bits. U bent gewaarschuwd.
Allereerst dient u een verbinding te maken tussen u PC en de µcontroller. Aan de PC-kant kunt u naar keuze via een USB poort, parallele poort of een seriële poort gebruiken om het programma op de controller zetten. Aan de kant van de controller wordt een 10-pins bandkabel aansluiting gebruikt. Het is verstandig om met de 10-pins connector compatibel te blijven met andere hardware, zoals bijvoorbeeld de STK500. Afhankelijk van de door u gekozen oplossing heeft u ook software voor uw PC nodig die om kan gaan met uw programmer. Dit soort software gaat er vanuit dat u een kant en klaar Intel *.hex beschikbaar heeft dat u wil uploaden naar uw controller. Het zal op de controller eerst het oude programma verwijderen, vervolgens het nieuwe er op schrijven en tenslotte controleren of alles er correct is opgeschreven. Dit alles is een kwestie van slechts enkele seconden.
- USB
Een USB programmer kan kant en klaar worden gekocht voor ong. €30,-. Er bestaat een duitstalige website met een simpele zelfbouw schakeling met 1 ATmega8, kosten ong €10,- (Afb. 1). Er is een apart document voor het zelfbouwen van deze USB-programmer. Een nadeel van zelfbouwen is dat er een programmer nodig is om de USB programmer te programmeren. Indien u wel zelf kunt solderen, maar nog geen programmer heeft, kunt u dit probleem omzeilen door een zelfbouwkit met voorgeprogrammeerde controller te kopen voor ong. €20,-. Voor zowel Linux als ook Windows is het programma om nieuwe software te uploaden met deze USB programmer AVRdude (manual).
- Parallel (verouderd)
De zelfbouw AVR programmer voor een printerpoort is makkelijk en goedkoop. De parallelle stekker is groot genoeg om ook alle benodigde electronica te bevatten (Afb. 2). Er wordt in de schakeling ook nog een optioneel ledje beschreven, maar dat gebruik ik niet. Het enige probleem is dat de nieuwste computers vaak geen printerpoort meer hebben. Om het programma via deze kabel op uw µcontroller te krijgen gebruik ik onder Windows PonyProg. Dit programma is gratis te downloaden en er bestaat ook een Linux versie van. Op de PC moet de instelling van de paralelle poort in ieder geval beter zijn dan standaard. Ik gebruik de EEP/ECP setting. Dan verloopt het programmeren met Ponyprog vlekkeloos.
- Seriëel (verouderd)
De hardware is iets gecompliceerder dan de paralelle uitvoering, maar ook goed te doen. Het probleem zit hem in goede drivers, zeker onder Windows XP en beter. Verder is ook hier het probleem dat nieuwe computers vaak geen seriele poort meer hebben. Dit is eventueel nog te omzeilen door een USB <-> Serieel adapterkabeltje te gebruiken, maar dat lost het driver probleem niet op. Om het programma via deze kabel op uw µcontroller te krijgen gebruik ik onder Windows PonyProg.
- STK500
Indien u een STK500 heeft, dan heeft u ook gelijk een seriële In System Programmer. Het nokje van de 10-polige connector dient aan de buitenkant te worden aangesloten. Vergeet echter niet om VTARGET te verwijderen. Een betere manier is overigens om bij al uw ontwerpen er rekening mee te houden dat de programmer nooit gevoed mag worden vanaf de doelcontroller. Oftewel dat VTG nooit aangesloten mag zijn in de ISP programmeerconnector op het ontvangende systeem. De pin layout van de ISP programmeer uitgangen op de STK500 is standaard. Op de STK500 is de VTG onder andere verbonden met de VTARGET. Indien U nu zelf een voeding op VTG zou aanbieden, dan zal dit met zekerheid tot beschadiging van de gestabilliseerde voedings op de STK500 leiden. Dit kan worden voorkomen door VTARGET te verwijderen. Maar deze staat aan als u een controller op de STK500 wilt programmeren. Dit zal volgens Murphy vroeg of laat tot beschadiging van de STK500 leiden. Dit geldt overigens niet enkel voor de STK500 maar ook voor diverse andere programmers. Sluit daarom in uw ontwerpen de ISP programma ontvangende connector nooit aan op VTG. Dan kan de STK500 niet beschadigen. Er is overigens ook geen zinnige reden waarom U VTG wel zou aansluiten, tenzij u uw ontwerp bewust vanuit de STK500 wil voeden. U heeft geen extra software nodig indien u met AVR-GCC werkt. Als ik de STK500 uitsluitend als programmer wil gebruiken dan dient het nokje van de programmeerkabel naar buiten te zijn gericht. Om het programma via deze kabel op uw µcontroller te krijgen gebruik ik onder Windows AVR studio.
Dit voorbeeld heeft betrekking op de STK500 en AVR Studio. Op het tabblad Program dient u onder het kopje Flash het door u gemaakte *.hex bestand te selecteren. Vervolgens kunt u op de button Program drukken. Als alles klopt zal nu de Led op de STK500 gaan knipperen en heeft u uw eerste programma op een controller geschreven. Na het ontvangen van een programma zal een µcontroller altijd automatisch rebooten. Kortom uw systeem is "up and running". Na een klein feestje wordt het nu tijd voor een iets serieuzere toepassing.
//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 ----------------------
?>