- Aansluitingen ENC28J60
|
- Voeding
Deze module moet op 3.3Vdc worden gevoed. Zodra de voeding aangeschakeld wordt gaat er een rode LED op de print branden. De overige pins, zoals bijvoorbeeld SPI, mogen ook met 5Vdc bediend worden.
- SPI
De ENC28J60 heeft een SPI interface zodat microcontrollers zoals de Arduino er makkelijk mee kunnen communiceren. Alle Arduino`s hebben een ingebouwde hardware SPI interface. De aansluitingen zijn daardoor vaste pennen maar welke pennen dat zijn, verschilt per Arduino.
ATmega | SPI | Brick | UNO |
50 | MISO/PCINT3 | SO | 12 |
51 | MOSI/PCINT2 | SI | 11 |
52 | SCK/PCINT1 | SCK | 13 |
53 | SS/PCINT0 | CS | 10 |
- Overige pins
- CLK (klok output van de ENC28J60)
- INT (interrupt output)
- WOL (niet verbonden, gereserveerd)
- RST (reset)
Netwerkkabel
Nadat alle pins correct zijn aangesloten mag de power worden aangezet. Indien er vervolgens een netwerkkabel wordt aangesloten dan gaat het het groene ledje continu branden en het amber ledje knippert.
|
- Beschrijving
|
Het wordt erg druk op ons Wifi netwerk. Dus probeer ik om zoveel mogelijk de apparaten die in de buurt van een router of switch staan te voorzien van een ethernet kabelaansluiting oftewel een ethernet aansluiting. Het nummer “ENC28J60” staat voor het chip nummer, ontwikkeld door Microchip. Het betreft een 28 pins chip waarin we een complete standalone Ethernet controller vinden voor gebruik met een 10BASE-T netwerk.
|
- Reset-button
|
Een harde reset van de netwerkverbinding kan soms handig zijn. Beide reset pins kunnen in rust toestand met een pull-up van bijv. 10k naar de plus worden getrokken.
- ENC28J60
One way to do it is to pull this pin low, then release it (or pull it high). This will get the ENC28j60 to reset, and wait for configuration from the arduino.
- Arduino reset
Om een reset te bewerkstelligen moet de reset pin op de Arduino naar de aarde getrokken worden.
|
- Bibliotheken
|
Dit lijstje is zeker niet uitputtend want er bestaan nog veel meer bibliotheken.
- Ethernet
Het standaard Arduino Ethernet Shield gebruikt ook een alles-in-een Ethernet Controller en de daarbij bijbehorende Ethernet bibliotheek wordt standaard meegeleverd met de IDE. De gebruikte controller hiervoor echter is een Wiznet W5100 en dat is iets heel anders dan onze ENC28J60. Daarom kan deze standaard bibliotheek niet worden gebruikt voor de ENC28J60.
- UIPEthernet
Er bestaat een uitstekende uitleg over de benodigde bibliotheek op tweaking4all. Deze bevat ook een *.zip van de Arduino Uip bibliotheek, maar de meest actuele kan direct van Github worden gedownload en geïnstalleerd in de IDE. Dat scheelt een aantal waarschuwingen tijdens het compileren van je sketches. Deze bibliotheek is te groot voor een Arduino Uno. Hij werkt wel correct op bijvoorbeeld een Mega 2560. Deze bibliotheek is erg gemakkelijk in het gebruik maar neemt heel veel ruimte en is relatief langzaam. Naar de gebruiker toe is deze bibliotheek erg Arduino sketch-achtig.
- Ethercard
Deze bibliotheek kan als *.zip worden gedownload van Github. Deze bibliotheek werkt ook op de Arduino Uno maar is aanzienlijk ingewikkelder in het gebruik dan UIPEthernet. Ook heeft deze bibliotheek een extra pin nodig op de Arduino om de CLK pin van de ENC28J60 aan te sluiten. Deze bibliotheek gebruikt technieken en objecten die voor een gemiddelde Arduino gebruiker moeilijk te bevatten zijn. Dit heeft alles te maken met de erg C-stijl manier van programmeren met pointers etc. en ook de manier waarop de communicatie op het internet feitelijk verloopt en last but not least met het feit dat deze bibliotheek optimaal gebruik maakt van de mogelijkheden van de ENC28J60 chip. Hierdoor is deze bibliotheek wel heerlijk snel en prachtig klein.
|
- Eerste ervaringen
|
Ik wil de module gebruiken als server, zodat hij een http-request kan beantwoorden.
- Introductie
We hebben bij het uitwisselen van data twee opties:
- Pull
Een applicatie op onze webserver bepaalt wanneer data van de Arduino opgehaald gaat worden. Dit is wat wij willen in onze flora toepassingen.
- Push
De Arduino bepaalt wanneer data naar onze webserver gestuurd wordt. Dit is onze situatie onwenselijk omdat wij ook vanaf de server opdrachten naar de Arduino willen kunnen sturen.
- Cliënt configuratie
Ik wil de module eigenlijk gebruiken als server. Maar eerst configureer ik hem als cliënt zodat ik met DHCP data uit mijn router kan aflezen: mac=00-01-02-03-04-05 name=ENC28J030405. Dit blijkt het MAC adres te zijn dat ik hem zelf heb toegewezen. Eigenlijk zou hij van zichzelf een mac adres moeten hebben. Als ik cliënt software01 laat draaien dan kan ik hem ook pingen.
- Server configuratie
Ik wil de Lan module kunnen aanspreken en dan een antwoord krijgen met sensor data. Hij moet zich wel aanmelden als DHCP cliënt.
|
//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 ----------------------
?>