Deze versie (CMUcam2) wordt al lang niet meer geleverd. De CMUcam2 was een videocamera bedoeld voor robottoepassingen.
- Aansluitingen
|
- Voedingsspanning
Volgens het manual moet de print worden gevoed met een spanning van 6 tot 15 Vdc die niet gestabiliseerd hoeft te zijn. De voeding wordt door een 7805 gestabiliseerd. Echter indien u deze print met 12 Vdc voedt is de dispensatie in de 7805 zo groot dat je je vinger er aan brandt. 5Vdc is officieel iets te weinig, maar werkt in de praktijk uitstekend. In deze robot kan de print worden gevoed vanuit het batterypack van mrBlueV2.
- RS232 seriële poort
Deze camera is oeroud en heeft een RS232 seriële poort als aansluiting. Geen enkele computer heeft nog een RS232 aansluiting, maar een Arduino wel. Gelukkig kan de CMUcam2 door de juiste jumpersetting ook een TTL (=5Vdc) signaal behappen in plaats van de standaard 12Vdc. Een Arduino zal zonder meer beschadigen met 12 Vdc aansluitingen. Er zijn 3 draden voor nodig:
- Aarde (zwart)
- CMU uit TX (blauw)
- CMU in RX (groen)
- Linux port probleem
Onder Ubuntu zijn de USB poorten automatisch by default enkel van de root gebruiker. Daardoor kunt u met lsusb zien dat de camera wel is aangesloten, maar u kunt er niets naar schrijven. De oplossing is:
- sudo gedit /etc/udev/rules.d/61-objdev.rules
- SUBSYSTEM!="usb_device", ACTION!="add", GOTO="objdev_rules_end"
# CMUcam2 SYSFS{idVendor}=="067b", SYSFS{idProduct}=="2303", GROUP="plugdev", MODE="666" LABEL="objdev_rules_end"
- sudo service udev restart
Nou dat is toch eenvoudig.
|
- Doelstelling
|
- `Chase da ball`
In de demo mode speelt de camera: Volg de bal. De camera volgt dan met pan en tilt de beweging die je de bal met je hand laat maken. De bal moet ongeveer ter grootte van een jeu de boules bal zijn en lekker contrasterend met de omgeving, bijv. rood. De demo mode laat dus de robot niet bewegen. Doelstelling: `Chase da ball` inclusief beweging van de robot. Dus ga echt achter de bal aan! Smarties sorteren en volg de lijn.
- Techniek
Deze camera is oeroud en heeft een RS232 seriële poort als aansluiting. Geen enkele computer heeft nog een RS232 aansluiting, maar een Arduino wel. Sinds deze camera op een manier is aan te sturen die vergelijkbaar is met een klassiek modem zou een Arduino de camera moeten kunnen bedienen. Behalve `Chase da ball` is er eigenlijk weinig extra te verwachten van deze camera. Op de homepage is onder andere een java programma te vinden (CMUcam2GUI) waarmee de camera kan worden getest maar daar is dus wel een PC voor nodig die nog een klassieke RS232 aansluiting heeft. In een museum misschien?
|
- Eerste kennismaking
|
Een herkenningspatroon moet gebaseerd zijn op vectors. Enkel op die manier zijn een kleine kever en een grote kever allebei toch een kever. Een associatie met een patroon is eigenlijk alleen mogelijk via een hybride geheugen, waarbij iedere laag een begrip voorstelt. Alle lagen worden tegelijkertijd met de input gevoed en daardoor verloopt het associatieproces erg snel. Het helpt wel als het input algoritme hetzelfde is als het output algoritme. Gelijke plaatjes moeten tot gelijke vectors leiden.
Hoe krijg ik het beeld van de cam op het internet? Hoe maak ik een webserver voor zoiets? Mijn eerste doel is een bewakingscamera. Dit moet gaan gebeuren met zogenaamde streaming video. linuxjournal.com/6720 En in welk formaat wil ik dan wel streamen? MPEG-4? De standaard client is een Linux box, maar het moet ook onder Windows werken.
Allereerst moet er een protocol worden gekozen. Http is zeer compatibel, maar is feitelijk niet geschikt voor streaming data. Http werkt uitsluitend met TCP terwijl UDP veel beter is voor streaming media. Verder kan het efficienter met rtsp. Andere mogelijkheden zijn veel minder compatibel, zoals: RTMP, PNM, MMS. Er moet ook een media format worden gekozen. Voor geluid lijkt MP3 de standaard. Echter Linux zal default geen MP3 player installeren in verband met de rechten. Een MP3 player bestaatb wel: rtsp.
Windows wel: MOV, MPEG4
Windows niet: FLV, RM
|
- Beschrijving
|
It is an ongoing project (homepage) and has produced 5 versions up till 2016. CMUcam2 is out of production for a while now but a lot of interesting material is available yet. A CMU cam is usually mounted on a pan & tilt module because the CMU board supplied with the cam has some interesting features. The cam is mounted as a shield that fits on the CMU board. The cam shield is a C3088 (datasheet) which uses an OV6620 (datasheet) sensor. This color sensor has a maximum resolution of 356x 292 pixels. The CMUcam2 has an extensive user guide.
The CMUcam2 can perform a demo mode trick on it`s own without the need of any extra hardware. Follow a color by adjusting the pan and tilt servo.
The CMU2 only communicates through a serial port, which was ok in the old days. However nowadays no serious computer has a serial port yet. So the latest versions of CMU have an USB connection. That is why we must use an Arduino to make the translation between the CMUcam2GUI and our Linux box.
De camera die werd bijgeleverd was de OV6620 (=C3088 op de print).
|
//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 ----------------------
?>