<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CarduBot &#8211; Makerblog.at</title>
	<atom:link href="https://www.makerblog.at/category/cardubot/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.makerblog.at</link>
	<description>Arduino Projekte, Tutorials, 3D-Druck und die Maker-Szene</description>
	<lastBuildDate>Wed, 29 Nov 2023 21:03:31 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://www.makerblog.at/wp-content/uploads/cropped-logo-100x100-2-32x32.jpg</url>
	<title>CarduBot &#8211; Makerblog.at</title>
	<link>https://www.makerblog.at</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>CarduBot Linea &#8211; einfacher Line Follower Roboter mit Chassis zum Selberkleben</title>
		<link>https://www.makerblog.at/2015/10/cardubot-linea-einfacher-linefollower-roboter-mit-chassis-zum-selberkleben/</link>
					<comments>https://www.makerblog.at/2015/10/cardubot-linea-einfacher-linefollower-roboter-mit-chassis-zum-selberkleben/#comments</comments>
		
		<dc:creator><![CDATA[Adi Dax]]></dc:creator>
		<pubDate>Wed, 28 Oct 2015 06:08:20 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[CarduBot]]></category>
		<guid isPermaLink="false">http://www.makerblog.at/?p=897</guid>

					<description><![CDATA[Der CarduBot ist ein einfacher Roboter mit 2 Rädern, dessen Chassis sich einfach aus einem Stück Karton zurechtschneiden lässt. Der CarduBot Line Follower (Linienverfolger) kann in dieser einfachsten Version mit nur 2 Lichtsensoren einer (z.B. mit schwarzem Isolierband) am Boden]]></description>
										<content:encoded><![CDATA[
<p>Der <strong>CarduBot</strong> ist ein einfacher Roboter mit 2 Rädern, dessen Chassis sich einfach aus einem Stück Karton zurechtschneiden lässt. Der CarduBot Line Follower (Linienverfolger) kann in dieser einfachsten Version mit nur 2 Lichtsensoren einer (z.B. mit schwarzem Isolierband) am Boden aufgeklebten Linie folgen.</p>



<p>Derzeit ruckelt der Bot noch recht heftig. Die aktuelle Version des Arduino Sketch verwendet einen reinen On/Off-Algorithmus, d.h. bei einer festgestellten Abweichung von der Linie wird diese direkt und mit voller Kraft wieder angesteuert. Ein neuer Arduino Sketch mit ansatzweiser Verwendung eines PID-Regler-Algorithmus ist in Arbeit, bei nur 2 Lichtsensoren ist das aber schwierig, da zu wenig Informationen über die Position der Linie vorliegen.</p>



<p>Eine Übersicht über Hardware und Software des CarduBot:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Line Follower Tutorial - CarduBot - Linienverfolger mit Arduino" width="700" height="394" src="https://www.youtube.com/embed/H2RAuL6r1Jg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Und hier eine längere Testfahrt:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="CarduBot 1.1 DIY Arduino Line Follower" width="700" height="394" src="https://www.youtube.com/embed/p0pXbPa5fYw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Derzeit bin ich noch dabei, verschiedene Chassis- und Aufbauvarianten zu testen. Eine genaue Dokumentation samt&nbsp;Vorlagen zum Selbstdrucken- und basteln gibt es in Kürze hier.</p>



<p>Ein genauerer Blick auf den Aufbau des <strong>CarduBot Linea</strong> genannten Line Followers:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="http://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1.jpg"><img fetchpriority="high" decoding="async" width="960" height="960" src="http://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1.jpg" alt="CarduBot - erster Testaufbau" class="wp-image-898" srcset="https://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1.jpg 960w, https://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1-150x150.jpg 150w, https://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1-300x300.jpg 300w, https://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1-270x270.jpg 270w, https://www.makerblog.at/wp-content/uploads/2015/10/CarduBot-1-230x230.jpg 230w" sizes="(max-width: 960px) 100vw, 960px" /></a><figcaption class="wp-element-caption">CarduBot Cardboard Arduino Line Follower</figcaption></figure>
</div>


<p><strong>Folgende Bauteile werden derzeit benötigt:</strong></p>



<p>&#8211; Arduino Uno<br>&#8211; Adafruit Motor Shield v2 (<a href="http://www.exp-tech.de/adafruit-motor-stepper-servo-shield-for-arduino-v2-kit?___SID=U" target="_blank" rel="noopener">Exp-Tech</a>)<br>&#8211; 2 DC Getriebemotoren, z.B. von Dagu (<a href="http://www.exp-tech.de/robotik/servos-motoren/dagu-dc-gear-motor-pair-90-degree-shaft" target="_blank" rel="noopener">Exp-Tech</a>)<br>&#8211; 2 passende Räder (<a href="http://www.exp-tech.de/robotik/sonstige/wheel-pair-65mm" target="_blank" rel="noopener">Exp-Tech</a>)<br>&#8211; 2 x Sparkfun Line Sensor Digital (<a href="http://www.exp-tech.de/sparkfun-line-sensor-breakout-qre1113-digital?___SID=U" target="_blank" rel="noopener">Exp-Tech</a>)<br>&#8211; Battery Pack für mind. 4 AA-Batterien<br>&#8211; einige Jumperkabel und ein kleines Breadboard<br>&#8211; Karton, Hartschaumplatte,&nbsp;Laubsägeholz o.ä. für das &#8222;Chassis&#8220;<br>&#8211; Kleber oder Heißklebepistole<br>&#8211; etwas schwarzes Isolierband für die Linie</p>



<p>Bei den Bauteilen&nbsp;gibt es noch viel Luft für Vereinfachungen, mit denen auch die Kosten (in dieser Version rund 50€) deutlich gesenkt werden können. Ganz ohne Löten geht es derzeit leider noch nicht, das Adafruit Motor Shield und die Line Sensoren erfordern ein paar einfache Lötarbeiten zur Befestigung der&nbsp;Stiftleisten.</p>



<p><strong>Hinweise zum Aufbau:</strong></p>



<p>Das&nbsp;Chassis des CarduBot lässt sich aus einigen&nbsp;Stücken Karton oder Hartschaumplatte einfach zusammenkleben. Ich verwende dazu am liebsten&nbsp;Heißkleber. Die Größe der Grundplatte berechnet man am besten so, dass zwischen den beiden&nbsp;aufgeklebten Getriebemotorenmotoren ein Batteriepack für 4xAA Batterien Platz findet.</p>



<p>Auf die beiden Motoren kann man dann ein weiteres Kartonstück aufkleben, das als Träger für den Arduino Uno samt aufgestecktem Adafruit Motor Shield v2 dient. Diese kann man entweder mit etwas Gummiband befestigen oder sich aus Karton eine kleine Box bauen. Damit der Roboter gut geradeaus fährt,&nbsp;klebt man hinten mittig ein kleine Stütze aus Karton auf, alternativ kann man auch ein Stützrad (<a href="http://www.exp-tech.de/pololu-ball-caster-with-3-8-plastic-ball?___SID=U" target="_blank" rel="noopener">Exp-Tech</a>) verwenden.</p>



<p>Die beiden Liniensensoren werden vorne angeklebt, zwischen den Sensoren sollte ca. 2 cm Abstand sein, der Abstand der Sensoren vom Untergrund sollte ca. 8-10mm betragen. Den optimalen Abstand für gute Messwerte kann man über den seriellen Monitor mit ein paar Testmessungen ermitteln.</p>



<p><strong>Die Verkabelung des Bots ist denkbar einfach:</strong></p>



<ul class="wp-block-list">
<li>4xAA Batteriepack an den Power-Anschluss des Motor Shield</li>



<li>Die beiden Getriebemotoren an die Ports M1 und M2 des Motor Shield. Sollte sich &nbsp;ein Motor in die falsche Richtung drehen, dann einfach die Anschlusskabel vertauschen.</li>



<li>Die beiden Sparkfun Line Sensoren benötigen 5V und GND vom Motor Shield. Die Datenleitungen kommen an die Digitalpins 2 und 3.</li>



<li>Dann den folgenden Code aufspielen und über den seriellen Monitor der Arduino IDE einen vernünftigen Wert für die Weiß/Schwarz-Grenze&nbsp;SENSOR_THRESHOLD ermitteln.</li>
</ul>



<p><strong>Der allererste Code für den Line Follower, noch sehr simpel und wackelig:</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-arduino"><span class="hljs-comment">// CarduBot Linea - Line Follower Prototype - v0.1</span>
<span class="hljs-comment">// 2015, makerblog.at</span>

<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">&lt;Wire.h&gt;</span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">&lt;Adafruit_MotorShield.h&gt;</span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"utility/Adafruit_PWMServoDriver.h"</span></span>

<span class="hljs-comment">// Motor Shield Objekt erzeugen</span>
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
<span class="hljs-comment">// Beide Motoren mit den Ports am Shield verbinden</span>
Adafruit_DCMotor *rightMotor = AFMS.getMotor(<span class="hljs-number">2</span>);
Adafruit_DCMotor *leftMotor = AFMS.getMotor(<span class="hljs-number">1</span>);

<span class="hljs-comment">// Pins für die digitalen Lichtsensoren</span>
<span class="hljs-keyword">int</span> rightSensorPin = <span class="hljs-number">2</span>;
<span class="hljs-keyword">int</span> leftSensorPin = <span class="hljs-number">3</span>;

<span class="hljs-keyword">int</span> rightSensorValue = <span class="hljs-number">0</span>;
<span class="hljs-keyword">int</span> leftSensorValue = <span class="hljs-number">0</span>;

<span class="hljs-comment">// Je nach Untergrund den Threshold für die Helligkeit anpassen. Messwerte werden über</span>
<span class="hljs-comment">// den seriellen Monitor ausgegeben!</span>
<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> SENSOR_THRESHOLD = <span class="hljs-number">2000</span>; <span class="hljs-comment">// &gt; 2000 = black</span>
<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> MOTOR_SPEED_FORWARD = <span class="hljs-number">120</span>;
<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> MOTOR_SPEED_BACKWARD = <span class="hljs-number">100</span>;
<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> MOTOR_SPEED_TURN = <span class="hljs-number">90</span>;

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">setup</span><span class="hljs-params">()</span> </span>{
 <span class="hljs-built_in">Serial</span>.<span class="hljs-built_in">begin</span>(<span class="hljs-number">9600</span>); <span class="hljs-comment">// set up Serial library at 9600 bps</span>
 <span class="hljs-built_in">Serial</span>.<span class="hljs-built_in">println</span>(<span class="hljs-string">"CarduBot Linea - Sensor Values"</span>);

 <span class="hljs-comment">// Motorshield starten und Motoren initialisieren</span>
 AFMS.<span class="hljs-built_in">begin</span>();
 rightMotor-&gt;<span class="hljs-built_in">setSpeed</span>(<span class="hljs-number">150</span>);
 rightMotor-&gt;<span class="hljs-built_in">run</span>(FORWARD);
 rightMotor-&gt;<span class="hljs-built_in">run</span>(RELEASE);
 leftMotor-&gt;<span class="hljs-built_in">setSpeed</span>(<span class="hljs-number">150</span>);
 leftMotor-&gt;<span class="hljs-built_in">run</span>(FORWARD);
 leftMotor-&gt;<span class="hljs-built_in">run</span>(RELEASE);
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">loop</span><span class="hljs-params">()</span> </span>{

 <span class="hljs-comment">// Sensorwerte auslesen (ca. zwischen 0 und 3000, je höher desto dunkler)</span>
 rightSensorValue = readLineSensor(rightSensorPin);
 leftSensorValue = readLineSensor(leftSensorPin);

 <span class="hljs-comment">// Debug-Ausgabe am seriellen Monitor</span>
 <span class="hljs-built_in">Serial</span>.<span class="hljs-built_in">print</span>(rightSensorValue);
 <span class="hljs-built_in">Serial</span>.<span class="hljs-built_in">print</span>(<span class="hljs-string">"; "</span>);
 <span class="hljs-built_in">Serial</span>.<span class="hljs-built_in">println</span>(leftSensorValue);

 <span class="hljs-comment">// Beide Sensoren hell (=schwarze Linie in der Mitte) =&gt; geradeaus</span>
 <span class="hljs-keyword">if</span> ((rightSensorValue &lt; SENSOR_THRESHOLD) &amp;&amp; (leftSensorValue &lt; SENSOR_THRESHOLD)) {
 driveForward();
 }

 <span class="hljs-comment">// Rechter Sensor dunkel =&gt; nach Rechts drehen, damit Linie wieder mittig</span>
 <span class="hljs-keyword">if</span> ((rightSensorValue &gt; SENSOR_THRESHOLD) &amp;&amp; (leftSensorValue &lt; SENSOR_THRESHOLD)) {
 turnRight();
 <span class="hljs-built_in">delay</span>(<span class="hljs-number">5</span>); 
 }

 <span class="hljs-comment">// Linker Sensor dunkel =&gt; nach Links drehen, damit Linie wieder mittig</span>
 <span class="hljs-keyword">if</span> ((rightSensorValue &lt; SENSOR_THRESHOLD) &amp;&amp; (leftSensorValue &gt; SENSOR_THRESHOLD)) {
 turnLeft();
 <span class="hljs-built_in">delay</span>(<span class="hljs-number">5</span>); 
 }

 <span class="hljs-comment">// Beide Sensoren dunkel (z.B. Stopplinie) = Boxenstopp</span>
 <span class="hljs-keyword">if</span> ((rightSensorValue &gt; SENSOR_THRESHOLD) &amp;&amp; (leftSensorValue &gt; SENSOR_THRESHOLD)) {
 stopMotors();
 }
}

<span class="hljs-comment">// Motoransteuerung</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">driveForward</span> <span class="hljs-params">()</span> </span>{
 rightMotor-&gt;<span class="hljs-built_in">run</span>(FORWARD);
 leftMotor-&gt;<span class="hljs-built_in">run</span>(FORWARD);
 rightMotor-&gt;<span class="hljs-built_in">setSpeed</span>(MOTOR_SPEED_FORWARD);
 leftMotor-&gt;<span class="hljs-built_in">setSpeed</span>(MOTOR_SPEED_FORWARD);
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">stopMotors</span> <span class="hljs-params">()</span> </span>{
 rightMotor-&gt;<span class="hljs-built_in">setSpeed</span>(<span class="hljs-number">0</span>);
 leftMotor-&gt;<span class="hljs-built_in">setSpeed</span>(<span class="hljs-number">0</span>);
 rightMotor-&gt;<span class="hljs-built_in">run</span>(RELEASE);
 leftMotor-&gt;<span class="hljs-built_in">run</span>(RELEASE);
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">turnRight</span><span class="hljs-params">()</span> </span>{
 rightMotor-&gt;<span class="hljs-built_in">setSpeed</span>(MOTOR_SPEED_TURN);
 leftMotor-&gt;<span class="hljs-built_in">setSpeed</span>(MOTOR_SPEED_TURN); 
 rightMotor-&gt;<span class="hljs-built_in">run</span>(BACKWARD);
 leftMotor-&gt;<span class="hljs-built_in">run</span>(FORWARD);
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">turnLeft</span><span class="hljs-params">()</span> </span>{
 rightMotor-&gt;<span class="hljs-built_in">setSpeed</span>(MOTOR_SPEED_TURN);
 leftMotor-&gt;<span class="hljs-built_in">setSpeed</span>(MOTOR_SPEED_TURN); 
 rightMotor-&gt;<span class="hljs-built_in">run</span>(FORWARD);
 leftMotor-&gt;<span class="hljs-built_in">run</span>(BACKWARD);
}

<span class="hljs-comment">// Auslesen der Lichtsensoren</span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">readLineSensor</span><span class="hljs-params">(<span class="hljs-keyword">int</span> sensorPin)</span></span>{
 <span class="hljs-built_in">pinMode</span>( sensorPin, <span class="hljs-literal">OUTPUT</span> );
 <span class="hljs-built_in">digitalWrite</span>( sensorPin, <span class="hljs-literal">HIGH</span> ); 
 <span class="hljs-built_in">delayMicroseconds</span>(<span class="hljs-number">10</span>);
 <span class="hljs-built_in">pinMode</span>( sensorPin, <span class="hljs-literal">INPUT</span> );
 <span class="hljs-keyword">long</span> time = <span class="hljs-built_in">micros</span>();
 <span class="hljs-comment">// schauen wie lange der Input auf HIGH ist, aber max. 3ms</span>
 <span class="hljs-keyword">while</span> (<span class="hljs-built_in">digitalRead</span>(sensorPin) == <span class="hljs-literal">HIGH</span> &amp;&amp; <span class="hljs-built_in">micros</span>() - time &lt; <span class="hljs-number">3000</span>); 
 <span class="hljs-keyword">int</span> diff = <span class="hljs-built_in">micros</span>() - time;
 <span class="hljs-keyword">return</span> diff;
}
</code></span></pre>


<p><strong>Geplante&nbsp;Verbesserungen:</strong></p>



<ul class="wp-block-list">
<li>Zur sinnvollen Umsetzung einer PID-Regelung (PID = Proportional &#8211; Integral &#8211; Differential, hört sich komplizierter an als es hier ist) sollten die beiden Line Sensoren durch ein Line Sensor Array, also eine Reihe von 6-8 Sensoren ersetzt werden. Damit&nbsp;ist eine viel flüssigere Verfolgung der Linie möglich.</li>



<li>Zur Kostenreduktion könnte das Adafruit Motor Shield durch einen L293D Motortreiber ersetzt werden. Das würde allerdings die Schaltung etwas komplizierter machen.</li>



<li>Für die verwendeten Standardkomponenten möchte ich eine Bastelvorlage zum Ausdrucken für die Kartonteile erstellen.</li>
</ul>



<p>Fragen und Anregungen zum CarduBot am besten hier als Kommentar hinterlassen.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.makerblog.at/2015/10/cardubot-linea-einfacher-linefollower-roboter-mit-chassis-zum-selberkleben/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>
