<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.spad-it.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WikiAdmin</id>
		<title>SPAD-it Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.spad-it.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WikiAdmin"/>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php/Special:Contributions/WikiAdmin"/>
		<updated>2026-07-04T07:30:37Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.3</generator>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Infrarood_afstandbediening&amp;diff=195</id>
		<title>Arduino - Infrarood afstandbediening</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Infrarood_afstandbediening&amp;diff=195"/>
				<updated>2020-12-14T10:48:17Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Beetje spelen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Infrarood is onzichtbaar licht. De golflengte van dat licht is wat langer dan van rood licht en onze ogen zijn daarvoor ongevoelig. Infrarood licht kan wel worden waargenomen met een digitale camera. Met bijvoorbeeld de camera van je mobieltje kun je in veel gevallen zien wanneer een afstandbediening een signaal uitzendt. Maar sommige mobieltjes hebben zo'n goed infrarood filter dat het daarbij niet werkt. In elk geval zend een IR afstandbediening infrarood licht uit dat door een ''ontvanger'' wordt gezien. Het uitgezonden licht is niet gewoon een lamp die aan of uit staat, maar een snel knipperend lampje, waarbij informatie verstopt zit in de knippering. Daardoor kan zo'n afstandbediening complexe opdrachten geven.&lt;br /&gt;
&lt;br /&gt;
===IR communicatieprotocol===&lt;br /&gt;
Voor het coderen van informatie in de knippering van afstandbedieningen bestaan diverse ''protocollen''. Een veelgebruikt protocol is het ''NEC protocol''. Hierbij wordt een digitaal signaal doorgegeven dat steeds bestaat uit 16 ''bits''. Een bit is simpelweg een 1 of een 0. Van de 16 bits zijn de eerste 8 bits het ''adres'', terwijl de tweede 8 bits staan voor het ''commando''. Simpel gezegd geeft het adres aan voor wie het signaal is bedoeld (TV, Video recorder, etc.), terwijl het commando aangeeft wat er moet gebeuren. Met 8 bits heb je genoeg voor 1024 adressen en dus ook 1024 commando's. Andere protocollen zijn o.a.: ''SONY'', ''RC5'' en ''RC6''.&lt;br /&gt;
&lt;br /&gt;
Het NEC protocol gebruikt een standaard knipperfrequentie van 38 kHz. Dat wil zeggen dat het lapmje 38 duizend keer per seconde aan en uit gaat. Dit wordt gedaan om verstoring door andere bronnen te vermijden; de ontvanger reageert alleen op lampjes die met ongeveer 38 kHz knipperen. Andere bronnen van infrarood licht hebben dan geen effect. Voor het doorgeven van een 0-bit geeft de zender een korte tijd een knipper-signaal en zet daarna het lampje even uit. Voor het doorgeven van een 1-bit geeft de zender ook een korte tijd een knipper-signaal, maar zet daarna het lampje wat langer uit. Een 0 heeft dus een korte pauze en een 1 een lange pauze. Er komt nog wel wat meer bij kijken, maar het belangrijkste is hiermee gezegd. Overigens hebben andere protocollen andere kenmerken. Zo heeft het SONY protocol een draagfrequentie van 40 kHz en meerdere modi (12 bit tot 20 bit). In het algemeen vallen de draagfrequenties van afstandbedieningen tussen de 30 en 56 kHz en kun je mogelijk niet alle draagfrequenties met dezelfde ontvanger bedienen.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:NEC_protocol.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Digitale 0 en digitale 1 volgens het NEC protocol&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Als zender heb je niet meer nodig dan een eenvoudige infrarood LED met weerstand. De ontvanger bestaat uit een infrarood sensor die filtert op ongeveer 40 kHz (geschikt voor alle gangbare protocollen). Meestal gebruiken we daarvoor een speciaal element: een IR ontvanger. Daarna moeten we de eentjes en nulletjes zien te ontdekken uit het ontvangen signaal. De software die hiervoor nodig is vinden we simpelweg in een kant en klare bibliotheek: '''IRremote.h'''. Met deze bibliotheek kun je zowel een infrarood zender als een ontvanger aansturen. We nemen aan dat je beschikt over een infrarood afstandbediening (zender), zodat we ons hier kunnen concentreren op de ontvanger. De bibliotheek is bovendien geschikt voor meerdere protocollen, waaronder dus NEC, SONY, RC5 en RC6. Dit zullen we in dit project ook zien zodat het voor nu niet nodig is om het protocol van je afstandbediening vooraf te weten.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Omdat we ons hier zuiver willen concentreren op de techniek, houden we het project zo eenvoudig mogelijk. De software geeft resultaten door aan de PC via de Serial Monitor; we gaan hier geen dingen of lampjes besturen.&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 infrarood afstandbediening (zender)&lt;br /&gt;
*1 infrarood ontvanger module&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:IRreciever.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|Een IR-ontvanger&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:IRreciever_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten IR-ontvanger&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
int RECV_PIN = 11;&lt;br /&gt;
IRrecv irrecv(RECV_PIN);&lt;br /&gt;
decode_results results; // variabele voor gedecodeerde resultaten&lt;br /&gt;
&lt;br /&gt;
void showResults(decode_results *results) { // LET OP: &amp;quot;*results&amp;quot; ipv &amp;quot;results&amp;quot; =&amp;gt; directe toegang tot de variabele&lt;br /&gt;
  if (results-&amp;gt;decode_type == UNKNOWN)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Onbekend protocol: kan helaas niet decoderen&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    if (results-&amp;gt;decode_type == NEC)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print(&amp;quot;Decoded NEC: &amp;quot;);&lt;br /&gt;
    } &lt;br /&gt;
    else if (results-&amp;gt;decode_type == SONY) &lt;br /&gt;
    {&lt;br /&gt;
      Serial.print(&amp;quot;Decoded SONY: &amp;quot;);&lt;br /&gt;
    } &lt;br /&gt;
    else if (results-&amp;gt;decode_type == RC5) &lt;br /&gt;
    {&lt;br /&gt;
      Serial.print(&amp;quot;Decoded RC5: &amp;quot;);&lt;br /&gt;
    } &lt;br /&gt;
    else if (results-&amp;gt;decode_type == RC6) &lt;br /&gt;
    {&lt;br /&gt;
      Serial.print(&amp;quot;Decoded RC6: &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else // DISH, SHARP, PANASONIC, JVC, SANYO, MITSUBISHI&lt;br /&gt;
    { // een van de andere herkende protocollen&lt;br /&gt;
      Serial.print(&amp;quot;Decoded type &amp;quot;);&lt;br /&gt;
      Serial.print(results-&amp;gt;decode_type);&lt;br /&gt;
      Serial.print(&amp;quot;: &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    Serial.print(results-&amp;gt;value, HEX);&lt;br /&gt;
    Serial.print(&amp;quot; (&amp;quot;);&lt;br /&gt;
    Serial.print(results-&amp;gt;bits, DEC);&lt;br /&gt;
    Serial.println(&amp;quot; bits)&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(RECV_PIN, INPUT);   &lt;br /&gt;
  pinMode(13, OUTPUT);  // OnBoard LEDje knippert bij signaal&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(9600);   // Start de Serial monitor&lt;br /&gt;
  irrecv.enableIRIn();  // Start de ontvanger software&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool on = false;&lt;br /&gt;
unsigned long last = millis();&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (irrecv.decode(&amp;amp;results)) &lt;br /&gt;
  {&lt;br /&gt;
    // Laat het OnBoard LEDje knipperen en toon results&lt;br /&gt;
    if (millis() - last &amp;gt; 250) // niet vaker dan 4x per secone (elke 250ms)&lt;br /&gt;
    {&lt;br /&gt;
      on = !on;  // &amp;quot;!&amp;quot; is &amp;quot;NOT&amp;quot;: aan gaat uit en uit gaat aan&lt;br /&gt;
      if (on==true) {&lt;br /&gt;
        digitalWrite(13, HIGH);&lt;br /&gt;
      } else {&lt;br /&gt;
        digitalWrite(13, LOW);&lt;br /&gt;
      }&lt;br /&gt;
      showResults(&amp;amp;results);  // LET OP: hier moet &amp;quot;&amp;amp;results&amp;quot; gebruikt omdat de functie &amp;quot;*results&amp;quot; gebruikt&lt;br /&gt;
    }&lt;br /&gt;
    last = millis();&lt;br /&gt;
    irrecv.resume(); // ontvang de volgende waarde&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
De ''setup()'' methode zet de pin-modes van de pin voor de IR receiver (pin 11) en de pin van de interne LED (pin 13) in output-mode. Daarna wordt de seriele interface gestart en ook de software van de IRremote bibliotheek.&lt;br /&gt;
&lt;br /&gt;
De ''loop()'' methode kijkt continu naar de receiver op pin 11. Indien de functie ''irrecv.decode()'' aangeeft dat er een signaal is uitgelezen, gaat de methode die informatie verwerken. Die informatie is dan al opgeslagen in de ''results'' variabele. Allereerst zal de OnBoard LED aan- of juist uitgezet worden (tot 4x per seconde). Daarna zal de uitgelezen waarde worden weggeschreven naar de Serial Monitor. Voor dat laatste roept het de functie ''showResults()'' aan.&lt;br /&gt;
&lt;br /&gt;
De functie ''showResults()'' leunt natuurlijk erg op de ''results'' variabele zelf. Deze is van het type ''decode_results'' en heeft intern het ''decode_type'' (integer), en een ''value'' (unsigned long). Daarnaast kun je via ''decode_results'' rechtstreeks de bits van het signaal benaderen, waarbij ''rawlen'' aangeeft hoeveel bits er zijn. Voor het ''decode_type'' heeft de library een serie voorgeprogrammeerde waarden zoals NEC, SONY, en RC5. Dit zijn dus geen teksten (tussen quotjes) maar namen van (integer) constanten.&lt;br /&gt;
&lt;br /&gt;
De functie vergelijkt dus de waarde van ''results-&amp;gt;decode_type'' met voorgeprogrammeerde waarden, zoals UNKNOWN, NEC, en SONY. Indien een van deze waarden wordt herkend, wordt de naam van het herkende protocol op de Serial Monitor gezet: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Serial.print(&amp;quot;Decoded SONY: &amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na het printen van de naam van het protocol, print de functie de ''value'' in HEX format. '''Deze ''value'' is in het algemeen het gegeven waarmee je een bepaalde functie zou uitvoeren''', tenminste als je echt een actie zou willen koppelen aan het gebruiken van de afstanbediening. Die value werd, nadat het protocol herkend werd, ook meteen bepaald. Ook het aantal bits waaruit die ''value'' bestaat wordt tussen haakjes weergegeven. Dit aantal is afhankelijk van het protocol.&lt;br /&gt;
&lt;br /&gt;
Het resultaat is ook als raw-data beschikbaar. Daarvoor heeft ''results'' een referentie aan ''rawbuf[]'' en een ''rawlen'' die de grootte van ''rawbuf'' aangeeft. Als je niet genoeg hebt aan ''value'' kun je hier eens naar kijken.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Loop eens door het huis om te zoeken naar afstandsbedieningen en kijk of je erachter kunt komen welke protocollen de afstandsbedieningen gebruiken. Hebben jullie een apparaat van Sony? Dan gebruikt die vast het SONY protocol! Apparaten van Philips gebruiken het RC5 of RC6 protocol, omdat die door Philips zijn ontwikkeld. Je zult ook wel eens merken dat een bepaald signaal verschillend wordt geinterpreteerd. Kennelijk lijken sommige protocollen soms teveel op elkaar om het onderscheid met voldoende zekerheid te maken, maar dit probleem kan natuurlijk ook worden veroorzaakt door onvolkomendheden in de IRremote bibliotheek.&lt;br /&gt;
&lt;br /&gt;
In principe kun je met de IRremote bibliotheek ook infrarood LED's aansturen. IR-LED's zijn goedkoop en op dezelfde wijze aan te sluiten als gewone LED's. Meestal zijn ze zwart/donkerpaars van kleur. Met zo'n schakeling kun je in elk van de ondersteunde protocollen commando's versturen. Eerst gebruik je dan bovenstaand project om erachter komen welk protocol en welk commando gebruikt wordt om jullie televisie aan en uit te zetten, of je maakt zelfs een lijst van alle belangrijke commando's van je TV afstandbediening. Vervolgens zou je die commando's in een Arduino kunnen programmeren zodat je met de Arduino de TV kunt bedienen. Je zou ook commando's via je toetsenbord kunnen opgeven als je gebruik maakt van een Serial connectie. Dan kun je je PC gebruiken als afstandbediening.&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een digitale clock|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Een joystick|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Een_digitale_clock&amp;diff=194</id>
		<title>Arduino - Een digitale clock</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Een_digitale_clock&amp;diff=194"/>
				<updated>2020-12-14T10:26:09Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Uitleg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een digitale clock module biedt Arduino de mogelijkheid om de echte datum en tijd uit te lezen. De term waar je op moet zoeken voor zo'n module is RTC - Real Time Clock. Een dergelijke module heeft een eigen batterij waarmee de klok oneindig doorloopt, ook als de stroom wordt uitgeschakeld. De interne klok draait om een kristal (TCXO - temperature compensated crystal oscillator) met een heel precies bekende eigen frequentie, waardoor de klok vrij nauwkeurig de tijd kan volgen. In dit voorbeeld gaan we uit van een populaire module, de DS3231, die voor minder dan €3,00 te koop wordt aangeboden. De specs hiervan geven een maximale afwijking van 0.5 seconde per dag. De module beschikt over een I2C bus waarmee hij met Arduino kan ''praten''. Een andere prettige eigenschap is dat deze module zowel op 3.3V kan werken als op 5V. Het ding heeft ook nog een temperatuurmeting aan boord, maar die heeft slechts een nauwkeurigheid van ±3˚C en dient vooral voor de interne temperatuurcompensatie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS3231_RTC.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS3231 RTC module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS3231 module&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS3231_Schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Schakeling voor een RTC module &amp;lt;u&amp;gt;voor een Arduino UNO&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De SDA aansluiting van de module moet aan analoge pin A4, terwijl de SCL aansluiting naar analoge pin A5 moet. De keuze van deze pin connecties is niet vrij; de I2C Wire interface vereist deze connecties. Het programma bevat dan ook geen regels om de pin-connecties in te stellen. Pas wel op: op een Arduino Mega gaat het voor de SDA om pin 20 en voor de SCL aansluiting om pin 21. Voor andere Arduino's kun je de juiste aansluitingen [https://www.arduino.cc/en/reference/wire hier] opzoeken.&lt;br /&gt;
&lt;br /&gt;
Overigens lijkt de afgebeelde RTC module geen batterij te hebben en heeft hij een dubbele set aansluitingen. De aansluitingen die we nodig hebben zijn VCC (rood, 5 Volt), GND (zwart, 0 Volt), SCL (groen) en SDA (oranje). Eventuele andere aansluitingen op de module kunnen we negeren.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#define DS3231_I2C_ADDRESS 0x68  // vervangt &amp;quot;DS3231_I2C_ADDRESS&amp;quot; steeds door de byte &amp;quot;0x68&amp;quot;&lt;br /&gt;
&lt;br /&gt;
char DayOfWeek[][4] = {&amp;quot;Mon&amp;quot;,&amp;quot;Tue&amp;quot;,&amp;quot;Wed&amp;quot;,&amp;quot;Thu&amp;quot;,&amp;quot;Fri&amp;quot;,&amp;quot;Sat&amp;quot;,&amp;quot;Sun&amp;quot;}; // DayOfWeek[0]=maandag en DayOfWeek[6]=zondag&lt;br /&gt;
&lt;br /&gt;
struct DateTime {&lt;br /&gt;
  byte year;&lt;br /&gt;
  byte month;&lt;br /&gt;
  byte day;&lt;br /&gt;
  byte hour;&lt;br /&gt;
  byte minute;&lt;br /&gt;
  byte second;&lt;br /&gt;
  byte dayOfWeek;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte decToBcd(byte val)&lt;br /&gt;
// Convert normal decimal numbers to binary coded decimal&lt;br /&gt;
{&lt;br /&gt;
  return( (val/10*16) + (val%10) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
byte bcdToDec(byte val)&lt;br /&gt;
// Convert binary coded decimal to normal decimal numbers&lt;br /&gt;
{&lt;br /&gt;
  return( (val/16*10) + (val%16) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setDS3231time(DateTime dt)&lt;br /&gt;
{&lt;br /&gt;
  // sets time and date data to DS3231&lt;br /&gt;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br /&gt;
  Wire.write(0); // set next input to start at the seconds register&lt;br /&gt;
  Wire.write(decToBcd(dt.second)); // set seconds&lt;br /&gt;
  Wire.write(decToBcd(dt.minute)); // set minutes&lt;br /&gt;
  Wire.write(decToBcd(dt.hour)); // set hours&lt;br /&gt;
  Wire.write(decToBcd(dt.dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)&lt;br /&gt;
  Wire.write(decToBcd(dt.day)); // set date (1 to 31)&lt;br /&gt;
  Wire.write(decToBcd(dt.month)); // set month&lt;br /&gt;
  Wire.write(decToBcd(dt.year)); // set year (0 to 99)&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void readDS3231time(DateTime &amp;amp;dt)  // dt by reference&lt;br /&gt;
{&lt;br /&gt;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br /&gt;
  Wire.write(0); // set DS3231 register pointer to 00h&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);&lt;br /&gt;
  // request seven bytes of data from DS3231 starting from register 00h&lt;br /&gt;
  dt.second = bcdToDec(Wire.read() &amp;amp; 0x7f);&lt;br /&gt;
  dt.minute = bcdToDec(Wire.read());&lt;br /&gt;
  dt.hour = bcdToDec(Wire.read() &amp;amp; 0x3f);&lt;br /&gt;
  dt.dayOfWeek = bcdToDec(Wire.read());&lt;br /&gt;
  dt.day = bcdToDec(Wire.read());&lt;br /&gt;
  dt.month = bcdToDec(Wire.read());&lt;br /&gt;
  dt.year = bcdToDec(Wire.read());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void displayDateTime(DateTime dt)&lt;br /&gt;
{&lt;br /&gt;
  Serial.print(DayOfWeek[dt.dayOfWeek]);&lt;br /&gt;
  Serial.print(' ');&lt;br /&gt;
  if (dt.day&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.day, DEC);&lt;br /&gt;
  Serial.print('-');&lt;br /&gt;
  if (dt.month&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.month, DEC);&lt;br /&gt;
  Serial.print(&amp;quot;-20&amp;quot;);  // &amp;quot;year&amp;quot; bestaat uit slechts een of twee decimalen&lt;br /&gt;
  if (dt.year&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.year, DEC);&lt;br /&gt;
  Serial.print(' ');&lt;br /&gt;
  if (dt.hour&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.hour, DEC);&lt;br /&gt;
  Serial.print(':');&lt;br /&gt;
  if (dt.minute&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.minute, DEC);&lt;br /&gt;
  Serial.print(':');&lt;br /&gt;
  if (dt.second&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.second, DEC);&lt;br /&gt;
  Serial.println();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  // als nodig stel je hier de datum en tijd opnieuw in &lt;br /&gt;
  // DateTime dt;&lt;br /&gt;
  // dt.year=17; // = 2017&lt;br /&gt;
  // dt.month=6;&lt;br /&gt;
  // dt.day=8;&lt;br /&gt;
  // dt.hour=10;&lt;br /&gt;
  // dt.minute=3;&lt;br /&gt;
  // dt.second=0;&lt;br /&gt;
  // dt.dayOfWeek=3; // 3=donderdag&lt;br /&gt;
  // setDS3231time(dt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  DateTime dt;&lt;br /&gt;
  readDS3231time(dt);&lt;br /&gt;
  displayDateTime(dt);&lt;br /&gt;
  delay(1000);  // elke seconde&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma gebruikt weer de library ''Wire.h'' die het I2C protocol implementeert. De tweede regel legt het adres vast van de DS3231 module op de I2C bus. Dat adres is 0x68 maar in de code kan ''DS3231_I2C_ADDRESS'' worden gebruikt. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define DS3231_I2C_ADDRESS 0x68&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Deze ''#define'' instructie zorgt er in feite voor dat overal waar ''DS3231_I2C_ADDRESS'' staat ''0x68'' wordt gelezen. Overigens is de schrijfwijze ''0x68'' een hexadecimale representatie van de byte. De decimale waarde ervan is 104.&lt;br /&gt;
&lt;br /&gt;
Vervolgens wordt een lijst met strings gedefinieerd waarin we de namen van de weekdagen opslaan. Het is handig om dit in een lijst te hebben omdat we later nummers van weekdagen moeten vertalen naar hun respectievelijke namen. &lt;br /&gt;
&lt;br /&gt;
Dan volgt er een stukje waarin een ''struct'' wordt gedefinieerd. Een ''struct'' is een variabele type dat meerdere elementen kan bevatten. Hier gaat het om een ''struct'' die we ''DateTime'' noemen, met daarin 7 bytes die we de namen geven ''year'', ''month'', ''day'', ''hour'', ''minute'', ''second'' en ''dayOfWeek''. Elke variabele van het type DateTime bevat vanaf nu 7 bytes die via hun namen beschikbaar zijn.&lt;br /&gt;
&lt;br /&gt;
Er volgen twee functies voor het omzetten van bytes van Bcd naar decimale codering en andersom. Dit heeft te maken met enigszins afwijkende de wijze waarop de gegevens van en naar de clock module worden gestuurd: Bcd format.&lt;br /&gt;
&lt;br /&gt;
De functie ''setDS3231time'' kan gebruikt worden om de datum en tijd in te stellen op de klok-module. Dit hoeft maar zelden te gebeuren, maar als je een nieuwe module hebt is het vaak wel nodig. Merk op dat deze functie een parameter mee krijgt van het type DateTime. De werking van de functie is alsvolgt. Via de I2C verbinding wordt een transmissie gestart. Daarna wordt er een '0' weggeschreven. Dit zorgt ervoor dat de module de gegevens die hij gaat ontvangen wegschrijft op de juikste plek (beginnend vanaf positie 0). Daarna worden de elementen van datum en tijd in de juiste volgorde weggeschreven naar de module. Kennelijk staat intern in de DS3231 seconde op positie 0, minute op positie 1, en zo voort. Als alles is opgestuurd wordt de transmissie afgesloten.&lt;br /&gt;
&lt;br /&gt;
De functie ''readDS3231time'' heeft ook een parameter van het type DateTime. Bij de parameternaam ''dt'' staat nu echter het '''&amp;amp;''' teken. Dit wijst erop dat de parameter ''by reference'' wordt doorgegeven: bij het doorgeven wordt geen kopie gemaakt van de waarde van de variabele (dat is standaard) maar wordt de variabele zelf doorgegeven. Daardoor kan de functie de inhoud van de variabele aanpassen en dat is natuurlijk wat deze read functie moet doen. De functie begint met een write opdracht binnen een transmissie. Dit zorgt ervoor dat de read opdrachten die volgen beginnen op positie 0. De eerste byte staat dan voor ''second''. Zonder die eerste write is het onduidelijk welke byte de module zal doorgeven en krijg je dus rommel. De feitelijke leesopdracht is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hierbij worden 7 bytes gelezen (daarvoor is de parameter 7). Deze worden in de Wire bibliotheek opgeslagen en zijn beschikbaar om uit te lezen. Dat uitlezen gebeurt vervolgens in de 7 volgende statements.&lt;br /&gt;
&lt;br /&gt;
De functie ''displayDateTime()'' verwerkt de opgegeven datum en schrijft die naar de Serial Monitor. Daarbij wordt ervoor gezorgt dat alle getallen met twee cijfers worden weggeschreven. 3 januarie 2001 wordt dan 03-01-2001 en niet 3-1-201. Merk op dat deze functie de lijst met weekdagen gebruikt om het dagnummer dayOfWeek om te zetten in een tekst.&lt;br /&gt;
&lt;br /&gt;
De ''setup()'' functie hoeft geen pin modi in te stellen omdat de I2C bus altijd via de A4 en A5 pins lopen (op een Arduino UNO). Het enige dat hier hoeft te gebeuren is het starten van de I2C verbinding en de normale seriele verbinding. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Verder kun je hier de datum en tijd van de module opnieuw instellen. Als die al goed staat moet je dit niet doen natuurlijk, want elke keer dat je programma start wordt de setup() doorlopen en wordt de datum/tijd opnieuw ingesteld op hetgeen je hier opgeeft.&lt;br /&gt;
&lt;br /&gt;
Ook de loop() functie is nu erg eenvoudig. De datum/tijd wordt uitgelezen uit de module middels de ''readDS3231time()'' functie, waarna die wordt weggeschreven naar de Serial Monitor via ''displayDateTime()''. Dan wacht de functie een seconde voor het zich kan herhalen.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Mochten datum en tijd verkeerd zijn ingesteld, en die kans is natuurlijk vrij groot, dan kun je juiste instellingen voor datum en tijd in de setup() zetten en de code daarvoor activeren (door de &amp;quot;//&amp;quot; ervoor weg te halen). Let op dat je dit stuk van de code zo precies mogelijk op het juiste moment uitvoert en vooral dat je ervoor waakt de code later niet te herstarten. Elke keer als setup() wordt uitgevoerd wordt de datum en tijd van de module namelijk weer teruggezet naar hetgeen in het programma staat. Om dat te voorkomen kun je het beste de betreffende regels, meteen na het succesvol uitvoeren ervan, weer veranderen in commentaar en de code opnieuw naar je Arduino sturen. Vanaf dat moment zou de RTC datum en tijd correct moeten onthouden en mee laten lopen met de echte tijd. Het is tenslotte een Real Time Clock. Desnoods breidt je je project uit met een knop waarmee datum en tijd wordt ingesteld. Dan time je met een goede klok het moment om op de knop te drukken. De uitdaging is om de klok op de seconde af correct ingesteld te krijgen.&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Temperatuur meten met een DS18B20 sensor|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Infrarood afstandbediening|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Een_digitale_clock&amp;diff=193</id>
		<title>Arduino - Een digitale clock</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Een_digitale_clock&amp;diff=193"/>
				<updated>2020-12-14T10:25:41Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* De schakeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een digitale clock module biedt Arduino de mogelijkheid om de echte datum en tijd uit te lezen. De term waar je op moet zoeken voor zo'n module is RTC - Real Time Clock. Een dergelijke module heeft een eigen batterij waarmee de klok oneindig doorloopt, ook als de stroom wordt uitgeschakeld. De interne klok draait om een kristal (TCXO - temperature compensated crystal oscillator) met een heel precies bekende eigen frequentie, waardoor de klok vrij nauwkeurig de tijd kan volgen. In dit voorbeeld gaan we uit van een populaire module, de DS3231, die voor minder dan €3,00 te koop wordt aangeboden. De specs hiervan geven een maximale afwijking van 0.5 seconde per dag. De module beschikt over een I2C bus waarmee hij met Arduino kan ''praten''. Een andere prettige eigenschap is dat deze module zowel op 3.3V kan werken als op 5V. Het ding heeft ook nog een temperatuurmeting aan boord, maar die heeft slechts een nauwkeurigheid van ±3˚C en dient vooral voor de interne temperatuurcompensatie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS3231_RTC.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS3231 RTC module&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS3231 module&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS3231_Schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Schakeling voor een RTC module &amp;lt;u&amp;gt;voor een Arduino UNO&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De SDA aansluiting van de module moet aan analoge pin A4, terwijl de SCL aansluiting naar analoge pin A5 moet. De keuze van deze pin connecties is niet vrij; de I2C Wire interface vereist deze connecties. Het programma bevat dan ook geen regels om de pin-connecties in te stellen. Pas wel op: op een Arduino Mega gaat het voor de SDA om pin 20 en voor de SCL aansluiting om pin 21. Voor andere Arduino's kun je de juiste aansluitingen [https://www.arduino.cc/en/reference/wire hier] opzoeken.&lt;br /&gt;
&lt;br /&gt;
Overigens lijkt de afgebeelde RTC module geen batterij te hebben en heeft hij een dubbele set aansluitingen. De aansluitingen die we nodig hebben zijn VCC (rood, 5 Volt), GND (zwart, 0 Volt), SCL (groen) en SDA (oranje). Eventuele andere aansluitingen op de module kunnen we negeren.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#define DS3231_I2C_ADDRESS 0x68  // vervangt &amp;quot;DS3231_I2C_ADDRESS&amp;quot; steeds door de byte &amp;quot;0x68&amp;quot;&lt;br /&gt;
&lt;br /&gt;
char DayOfWeek[][4] = {&amp;quot;Mon&amp;quot;,&amp;quot;Tue&amp;quot;,&amp;quot;Wed&amp;quot;,&amp;quot;Thu&amp;quot;,&amp;quot;Fri&amp;quot;,&amp;quot;Sat&amp;quot;,&amp;quot;Sun&amp;quot;}; // DayOfWeek[0]=maandag en DayOfWeek[6]=zondag&lt;br /&gt;
&lt;br /&gt;
struct DateTime {&lt;br /&gt;
  byte year;&lt;br /&gt;
  byte month;&lt;br /&gt;
  byte day;&lt;br /&gt;
  byte hour;&lt;br /&gt;
  byte minute;&lt;br /&gt;
  byte second;&lt;br /&gt;
  byte dayOfWeek;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
byte decToBcd(byte val)&lt;br /&gt;
// Convert normal decimal numbers to binary coded decimal&lt;br /&gt;
{&lt;br /&gt;
  return( (val/10*16) + (val%10) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
byte bcdToDec(byte val)&lt;br /&gt;
// Convert binary coded decimal to normal decimal numbers&lt;br /&gt;
{&lt;br /&gt;
  return( (val/16*10) + (val%16) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setDS3231time(DateTime dt)&lt;br /&gt;
{&lt;br /&gt;
  // sets time and date data to DS3231&lt;br /&gt;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br /&gt;
  Wire.write(0); // set next input to start at the seconds register&lt;br /&gt;
  Wire.write(decToBcd(dt.second)); // set seconds&lt;br /&gt;
  Wire.write(decToBcd(dt.minute)); // set minutes&lt;br /&gt;
  Wire.write(decToBcd(dt.hour)); // set hours&lt;br /&gt;
  Wire.write(decToBcd(dt.dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)&lt;br /&gt;
  Wire.write(decToBcd(dt.day)); // set date (1 to 31)&lt;br /&gt;
  Wire.write(decToBcd(dt.month)); // set month&lt;br /&gt;
  Wire.write(decToBcd(dt.year)); // set year (0 to 99)&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void readDS3231time(DateTime &amp;amp;dt)  // dt by reference&lt;br /&gt;
{&lt;br /&gt;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br /&gt;
  Wire.write(0); // set DS3231 register pointer to 00h&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);&lt;br /&gt;
  // request seven bytes of data from DS3231 starting from register 00h&lt;br /&gt;
  dt.second = bcdToDec(Wire.read() &amp;amp; 0x7f);&lt;br /&gt;
  dt.minute = bcdToDec(Wire.read());&lt;br /&gt;
  dt.hour = bcdToDec(Wire.read() &amp;amp; 0x3f);&lt;br /&gt;
  dt.dayOfWeek = bcdToDec(Wire.read());&lt;br /&gt;
  dt.day = bcdToDec(Wire.read());&lt;br /&gt;
  dt.month = bcdToDec(Wire.read());&lt;br /&gt;
  dt.year = bcdToDec(Wire.read());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void displayDateTime(DateTime dt)&lt;br /&gt;
{&lt;br /&gt;
  Serial.print(DayOfWeek[dt.dayOfWeek]);&lt;br /&gt;
  Serial.print(' ');&lt;br /&gt;
  if (dt.day&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.day, DEC);&lt;br /&gt;
  Serial.print('-');&lt;br /&gt;
  if (dt.month&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.month, DEC);&lt;br /&gt;
  Serial.print(&amp;quot;-20&amp;quot;);  // &amp;quot;year&amp;quot; bestaat uit slechts een of twee decimalen&lt;br /&gt;
  if (dt.year&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.year, DEC);&lt;br /&gt;
  Serial.print(' ');&lt;br /&gt;
  if (dt.hour&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.hour, DEC);&lt;br /&gt;
  Serial.print(':');&lt;br /&gt;
  if (dt.minute&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.minute, DEC);&lt;br /&gt;
  Serial.print(':');&lt;br /&gt;
  if (dt.second&amp;lt;10) Serial.print('0');&lt;br /&gt;
  Serial.print(dt.second, DEC);&lt;br /&gt;
  Serial.println();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  // als nodig stel je hier de datum en tijd opnieuw in &lt;br /&gt;
  // DateTime dt;&lt;br /&gt;
  // dt.year=17; // = 2017&lt;br /&gt;
  // dt.month=6;&lt;br /&gt;
  // dt.day=8;&lt;br /&gt;
  // dt.hour=10;&lt;br /&gt;
  // dt.minute=3;&lt;br /&gt;
  // dt.second=0;&lt;br /&gt;
  // dt.dayOfWeek=3; // 3=donderdag&lt;br /&gt;
  // setDS3231time(dt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  DateTime dt;&lt;br /&gt;
  readDS3231time(dt);&lt;br /&gt;
  displayDateTime(dt);&lt;br /&gt;
  delay(1000);  // elke seconde&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma gebruikt weer de library ''Wire.h'' die het I2C protocol implementeerd. De tweede regel legt het adres vast van de DS3231 module op de I2C bus. Dat adres is 0x68 maar in de code kan ''DS3231_I2C_ADDRESS'' worden gebruikt. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define DS3231_I2C_ADDRESS 0x68&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Deze ''#define'' instructie zorgt er in feite voor dat overal waar ''DS3231_I2C_ADDRESS'' staat ''0x68'' wordt gelezen. Overigens is de schrijfwijze ''0x68'' een hexadecimale representatie van de byte. De decimale waarde ervan is 104.&lt;br /&gt;
&lt;br /&gt;
Vervolgens wordt een lijst met strings gedefinieerd waarin we de namen van de weekdagen opslaan. Het is handig om dit in een lijst te hebben omdat we later nummers van weekdagen moeten vertalen naar hun respectievelijke namen. &lt;br /&gt;
&lt;br /&gt;
Dan volgt er een stukje waarin een ''struct'' wordt gedefinieerd. Een ''struct'' is een variabele type dat meerdere elementen kan bevatten. Hier gaat het om een ''struct'' die we ''DateTime'' noemen, met daarin 7 bytes die we de namen geven ''year'', ''month'', ''day'', ''hour'', ''minute'', ''second'' en ''dayOfWeek''. Elke variabele van het type DateTime bevat vanaf nu 7 bytes die via hun namen beschikbaar zijn.&lt;br /&gt;
&lt;br /&gt;
Er volgen twee functies voor het omzetten van bytes van Bcd naar decimale codering en andersom. Dit heeft te maken met enigszins afwijkende de wijze waarop de gegevens van en naar de clock module worden gestuurd: Bcd format.&lt;br /&gt;
&lt;br /&gt;
De functie ''setDS3231time'' kan gebruikt worden om de datum en tijd in te stellen op de klok-module. Dit hoeft maar zelden te gebeuren, maar als je een nieuwe module hebt is het vaak wel nodig. Merk op dat deze functie een parameter mee krijgt van het type DateTime. De werking van de functie is alsvolgt. Via de I2C verbinding wordt een transmissie gestart. Daarna wordt er een '0' weggeschreven. Dit zorgt ervoor dat de module de gegevens die hij gaat ontvangen wegschrijft op de juikste plek (beginnend vanaf positie 0). Daarna worden de elementen van datum en tijd in de juiste volgorde weggeschreven naar de module. Kennelijk staat intern in de DS3231 seconde op positie 0, minute op positie 1, en zo voort. Als alles is opgestuurd wordt de transmissie afgesloten.&lt;br /&gt;
&lt;br /&gt;
De functie ''readDS3231time'' heeft ook een parameter van het type DateTime. Bij de parameternaam ''dt'' staat nu echter het '''&amp;amp;''' teken. Dit wijst erop dat de parameter ''by reference'' wordt doorgegeven: bij het doorgeven wordt geen kopie gemaakt van de waarde van de variabele (dat is standaard) maar wordt de variabele zelf doorgegeven. Daardoor kan de functie de inhoud van de variabele aanpassen en dat is natuurlijk wat deze read functie moet doen. De functie begint met een write opdracht binnen een transmissie. Dit zorgt ervoor dat de read opdrachten die volgen beginnen op positie 0. De eerste byte staat dan voor ''second''. Zonder die eerste write is het onduidelijk welke byte de module zal doorgeven en krijg je dus rommel. De feitelijke leesopdracht is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hierbij worden 7 bytes gelezen (daarvoor is de parameter 7). Deze worden in de Wire bibliotheek opgeslagen en zijn beschikbaar om uit te lezen. Dat uitlezen gebeurt vervolgens in de 7 volgende statements.&lt;br /&gt;
&lt;br /&gt;
De functie ''displayDateTime()'' verwerkt de opgegeven datum en schrijft die naar de Serial Monitor. Daarbij wordt ervoor gezorgt dat alle getallen met twee cijfers worden weggeschreven. 3 januarie 2001 wordt dan 03-01-2001 en niet 3-1-201. Merk op dat deze functie de lijst met weekdagen gebruikt om het dagnummer dayOfWeek om te zetten in een tekst.&lt;br /&gt;
&lt;br /&gt;
De ''setup()'' functie hoeft geen pin modi in te stellen omdat de I2C bus altijd via de A4 en A5 pins lopen (op een Arduino UNO). Het enige dat hier hoeft te gebeuren is het starten van de I2C verbinding en de normale seriele verbinding. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Verder kun je hier de datum en tijd van de module opnieuw instellen. Als die al goed staat moet je dit niet doen natuurlijk, want elke keer dat je programma start wordt de setup() doorlopen en wordt de datum/tijd opnieuw ingesteld op hetgeen je hier opgeeft.&lt;br /&gt;
&lt;br /&gt;
Ook de loop() functie is nu erg eenvoudig. De datum/tijd wordt uitgelezen uit de module middels de ''readDS3231time()'' functie, waarna die wordt weggeschreven naar de Serial Monitor via ''displayDateTime()''. Dan wacht de functie een seconde voor het zich kan herhalen.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Mochten datum en tijd verkeerd zijn ingesteld, en die kans is natuurlijk vrij groot, dan kun je juiste instellingen voor datum en tijd in de setup() zetten en de code daarvoor activeren (door de &amp;quot;//&amp;quot; ervoor weg te halen). Let op dat je dit stuk van de code zo precies mogelijk op het juiste moment uitvoert en vooral dat je ervoor waakt de code later niet te herstarten. Elke keer als setup() wordt uitgevoerd wordt de datum en tijd van de module namelijk weer teruggezet naar hetgeen in het programma staat. Om dat te voorkomen kun je het beste de betreffende regels, meteen na het succesvol uitvoeren ervan, weer veranderen in commentaar en de code opnieuw naar je Arduino sturen. Vanaf dat moment zou de RTC datum en tijd correct moeten onthouden en mee laten lopen met de echte tijd. Het is tenslotte een Real Time Clock. Desnoods breidt je je project uit met een knop waarmee datum en tijd wordt ingesteld. Dan time je met een goede klok het moment om op de knop te drukken. De uitdaging is om de klok op de seconde af correct ingesteld te krijgen.&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Temperatuur meten met een DS18B20 sensor|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Infrarood afstandbediening|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=192</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=192"/>
				<updated>2020-12-07T12:15:33Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Draairichting omkeren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door boven de verzadigingsspanning. Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiken hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand. Een MOSFET kan echt ontzettend snel schakelen zodat de frequentie van het PWM signaal geen enkel probleem vormt.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan: de richting van het pijltje. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden ook vaak weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besproken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijl de spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven weer aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) NPN transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
[[MOSFET's en de brugschakeling in meer detail|Hier]] zijn overigens meer details te vinden voor als je zelf een MOSFET brugschakeling zou willen ontwerpen. Er is ook een goed werkend voorbeeld tot wel 20 Ampere bij 30 Volt.&lt;br /&gt;
&lt;br /&gt;
Al met al heb je nu een aardig idee hoe het werkt, maar echt gemakkelijk is het natuurlijk niet; het is een heel klusje om alle benodigde onderdelen goed aan te sluiten. Gelukkig zijn er voldoende alternatieven. Zo zijn er voor relatief weinig geld kant-en-klare driver boards te koop. Meestal gaat het dan om bordjes die gemaakt zijn voor het aansturen van bipolaire stappenmotoren, maar die zijn ook heel bruikbaar voor gewone gelijkstroommotoren. Voor de werking daarvan moet namelijk ook de stroomrichting worden omgekeerd zodat die ook gebasseerd zijn op de H-brug schakeling. Dergelijke bordjes zijn vaak gebasseerd op een chip met twee of soms zelfs vier ingebouwde H-brug schakelingen aan boord. Iets minder krachtig dan met losse MOSFET's maar veel gemakkelijke in gebruik. Een veelgebruikt voorbeeld is de L298N chip, inderdaad bedoeld voor bipolaire stappenmotoren. Een dergelijk bordje gaat tot zo'n 35 Volt en 2 Ampere, terwijl de logica op 5 Volt mag draaien (max 7 Volt). Prima geschikt dus voor onze Arduino. Voor deze specs moet het bordje wel uitgevoerd worden met een geschikte koeler, maar gekochte bordjes hebben vrijwel altijd een koeler. Omdat deze modules geschikt zijn voor bipolaire stappenmoteren, zijn ze gemaakt voor 2 sets van spoelen en hebben ze twee volledige H-brug schakelingen aan boord. In ondertsaand project sturen we maar een DC motor aan, maar je kunt dus ook twee motoren tegelijk mee aansturen. Of één zwaardere motor, door de beide H-bruggen parallel te gebruiken. Dan gaat hij tot 4 Ampere.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 L298N MOSFET driver module&lt;br /&gt;
*1 DC motor (bijv. 12 Volt)&lt;br /&gt;
*1 Bijpassende batterij (dan ook 12 Volt)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=191</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=191"/>
				<updated>2020-12-07T12:08:43Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* MOSFET driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door boven de verzadigingsspanning. Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiken hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand. Een MOSFET kan echt ontzettend snel schakelen zodat de frequentie van het PWM signaal geen enkel probleem vormt.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan: de richting van het pijltje. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden ook vaak weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) NPN transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
[[MOSFET's en de brugschakeling in meer detail|Hier]] zijn overigens meer details te vinden voor als je zelf een MOSFET brugschakeling zou willen ontwerpen. Er is ook een goed werkend voorbeeld tot wel 20 Ampere bij 30 Volt.&lt;br /&gt;
&lt;br /&gt;
Al met al heb je nu een aardig idee hoe het werkt, maar echt gemakkelijk is het natuurlijk niet; het is een heel klusje om alle benodigde onderdelen goed aan te sluiten. Gelukkig zijn er voldoende alternatieven. Zo zijn er voor relatief weinig geld kant-en-klare driver boards te koop. Meestal gaat het dan om bordjes die gemaakt zijn voor het aansturen van bipolaire stappenmotoren, maar die zijn ook heel bruikbaar voor gewone gelijkstroommotoren. Voor de werking daarvan moet namelijk ook de stroomrichting worden omgekeerd zodat die ook gebasseerd zijn op de H-brug schakeling. Dergelijke bordjes zijn vaak gebasseerd op een chip met twee of soms zelfs vier ingebouwde H-brug schakelingen aan boord. Iets minder krachtig dan met losse MOSFET's maar veel gemakkelijke in gebruik. Een veelgebruikt voorbeeld is de L298N chip, inderdaad bedoeld voor bipolaire stappenmotoren. Een dergelijk bordje gaat tot zo'n 35 Volt en 2 Ampere, terwijl de logica op 5 Volt mag draaien (max 7 Volt). Prima geschikt dus voor onze Arduino. Voor deze specs moet het bordje wel uitgevoerd worden met een geschikte koeler, maar gekochte bordjes hebben vrijwel altijd een koeler. Omdat deze modules geschikt zijn voor bipolaire stappenmoteren, zijn ze gemaakt voor 2 sets van spoelen en hebben ze twee volledige H-brug schakelingen aan boord. In ondertsaand project sturen we maar een DC motor aan, maar je kunt dus ook twee motoren tegelijk mee aansturen. Of één zwaardere motor, door de beide H-bruggen parallel te gebruiken. Dan gaat hij tot 4 Ampere.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 L298N MOSFET driver module&lt;br /&gt;
*1 DC motor (bijv. 12 Volt)&lt;br /&gt;
*1 Bijpassende batterij (dan ook 12 Volt)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_4-digit_LED_Segment_Display&amp;diff=190</id>
		<title>Arduino - 4-digit LED Segment Display</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_4-digit_LED_Segment_Display&amp;diff=190"/>
				<updated>2020-12-07T11:31:13Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Uitleg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===4-Digit Segment Display===&lt;br /&gt;
In het [[Arduino - 1-digit LED Segment Display|vorige project]] hebben we het 1-digit segment display behandeld. Dit display heeft 9 pootjes die aangesloten moeten worden op de Arduino. Als we nu 4 digits zouden willen aansluiten, zien we meteen dat de Arduino daar gewoonweg niet genoeg aanlsuitingen voor heeft; we zouden dan minstens 33 aansluitingen moeten hebben (de common cathode/annode kan worden gecombineerd). Om nu toch met een beperkt aantal pootjes uit te kunnen heeft men een truuk bedacht waarmee de digits snel achter elkaar aangezet kunnen worden. Het 4-digit segment display heeft, net als het 1-digit segment display, een aansluiting voor elk van de LED's a, b, c, d, e, f, g en dp (digital point). Daarnaast is de common cathode (of annode - we gaan nu uit van een common cathode) vervangen door vier aansluitingen: een voor elke digit! &lt;br /&gt;
Laten we uitgaan van een common cathode. Elke LED heeft twee aansluitingen: de plus en de min kant. De LED brandt alleen als de plus kant hoog is en de min kant laag. In alle andere gevallen brandt de LED niet. Als de min-kant hoog is, kan de plus-kant hoog of laag zijn: de LED brandt niet. Nu heeft elke digit zijn eigen common cathode. Als die common cathode hoog is, is de hele digit uit, ongeacht de situaties van a, b, c, d, e, f, g, en dp. Als de common cathode laag is, branden de LED's van die digit volgens het patroon dat op a, b, c, d, e, f, g, en dp staat. Wat we moeten doen is dus om beurten digits selecteren met het bijbehorende patroon. Natuurlijk is elke digit dan maar een kwart van de tijd aan terwijl de Arduino driekwart van de tijd met de andere digits bezig is, maar dit kan zo snel worden afgewisseld dat de gebruiker er niets van merkt.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:4_digit_segment_display.png|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Het 4 segment display met pin aansluitingen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Net als bij het 1-digit display, heeft elke digit weer 8 LED's: drie horizontale streepjes, twee vertikale streepjes boven, twee vertikale streepjes onder en de punt. De digits zelf hebben nu echter ook een aanlsuiting. Een digit gaat aan als de betreffende aansluiting nul wordt. Een LEDje van de zo geselecteerde digit gaat aan als de betreffende pin hoog wordt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 4-digit segment display met common cathode (= gemeenschappelijke min)&lt;br /&gt;
*8 weerstanden van 180Ω-220Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:4_digit_segment_display_-_circuit.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Schakeling voor 4 digit segment display&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Let op, want het zijn een heleboel draadjes die allemaal correct verbonden moeten worden. Het kan een goed idee zijn om steeds twee kleuren om en om te gebruiken: dus bijvoorbeeld blauw af te wisselen met groen. Dan worden de connecties iets minder snel verwisseld.&lt;br /&gt;
&lt;br /&gt;
Een ander belangrijk ding om op te merken is dat de schakeling de pins 0 en 1 van de Arduino niet gebruikt. Op zich zijn deze pins prima bruikbaar, maar op de printplaat van de Arduino gebruikt de seriele communicatie dezelfde pins. Je kunt deze pins dus niet samen met de seriele communicatie gebruiken. Als je het wel probeert zul je merken dat je schakeling vreemde resultaten oplevert.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
Het volgende programma bevat een paar nieuwe elementen. Upload het eerst maar naar je Arduino. Het wordt hieronder in detail besproken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
byte digits[4];     // lijst met pin-nummers van de 4 digit-common annodes&lt;br /&gt;
byte LEDs[8];       // lijst met alle LED-pins a,b,c,d,e,f,g, en de punt&lt;br /&gt;
byte patronen[10];  // lijst met bit patronen voor alle cijfers, de punt, en de '-'&lt;br /&gt;
byte point=B00000001;  // de punt&lt;br /&gt;
byte minus=B00000010;  // de &amp;quot;-&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // vul de tabel met aan/uit patronen voor elk van de cijfers&lt;br /&gt;
  // &amp;quot;B&amp;quot; is de &amp;quot;binary formatter&amp;quot;: B10000010 =&amp;gt; alleen het eerste en een-na-laatste bit staan aan&lt;br /&gt;
  // het eerste bit is voor de &amp;quot;a&amp;quot; LED, het tweede voor de &amp;quot;b&amp;quot; LED, enz. Het laatste is voor de punt&lt;br /&gt;
  // pattern = Babcdefgp;&lt;br /&gt;
  patronen[ 0]=B11111100;&lt;br /&gt;
  patronen[ 1]=B01100000;&lt;br /&gt;
  patronen[ 2]=B11011010;&lt;br /&gt;
  patronen[ 3]=B11110010;&lt;br /&gt;
  patronen[ 4]=B01100110;&lt;br /&gt;
  patronen[ 5]=B10110110;&lt;br /&gt;
  patronen[ 6]=B10111110;&lt;br /&gt;
  patronen[ 7]=B11100000;&lt;br /&gt;
  patronen[ 8]=B11111110;&lt;br /&gt;
  patronen[ 9]=B11110110;&lt;br /&gt;
  // specify pins for the common anodes (-)&lt;br /&gt;
  digits[0] = 5;&lt;br /&gt;
  digits[1] = 4;&lt;br /&gt;
  digits[2] = 3;&lt;br /&gt;
  digits[3] = 2;&lt;br /&gt;
  // specify pins for LED cathodes (+)&lt;br /&gt;
  LEDs[0] = 13;&lt;br /&gt;
  LEDs[1] = 12;&lt;br /&gt;
  LEDs[2] = 11;&lt;br /&gt;
  LEDs[3] = 10;&lt;br /&gt;
  LEDs[4] = 9;&lt;br /&gt;
  LEDs[5] = 8;&lt;br /&gt;
  LEDs[6] = 7;&lt;br /&gt;
  LEDs[7] = 6;&lt;br /&gt;
  // set all used pins in output mode&lt;br /&gt;
  for (byte i=0; i&amp;lt;4; i++)&lt;br /&gt;
    pinMode(digits[i], OUTPUT);&lt;br /&gt;
  for (byte i=0; i&amp;lt;8; i++)&lt;br /&gt;
    pinMode(LEDs[i], OUTPUT);&lt;br /&gt;
/*&lt;br /&gt;
  // cool test patroon - met tijdmeting&lt;br /&gt;
  unsigned long tijd=millis();&lt;br /&gt;
  for (unsigned long i=0; i&amp;lt;20; i++)&lt;br /&gt;
  {&lt;br /&gt;
    byte patroon = B10000000;&lt;br /&gt;
    for (byte j=0; j&amp;lt;6; j++)&lt;br /&gt;
      doDisplay(patroon &amp;gt;&amp;gt; j,patroon &amp;gt;&amp;gt; j,patroon &amp;gt;&amp;gt; j,patroon &amp;gt;&amp;gt; j,50,255);&lt;br /&gt;
  }&lt;br /&gt;
  tijd = millis() - tijd;&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  delay(10);&lt;br /&gt;
  Serial.print(&amp;quot;20 rondes kostte: &amp;quot;);&lt;br /&gt;
  Serial.print(0.001*tijd);&lt;br /&gt;
  Serial.println(&amp;quot; seconden&amp;quot;);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
  // make a light go round&lt;br /&gt;
  doDisplay(B10000000,B00000000,B00000000,B00000000,50);&lt;br /&gt;
  doDisplay(B00000000,B10000000,B00000000,B00000000,50);&lt;br /&gt;
  doDisplay(B00000000,B00000000,B10000000,B00000000,50);&lt;br /&gt;
  doDisplay(B00000000,B00000000,B00000000,B10000000,50);&lt;br /&gt;
  doDisplay(B00000000,B00000000,B00000000,B01000000,50);&lt;br /&gt;
  doDisplay(B00000000,B00000000,B00000000,B00100000,50);&lt;br /&gt;
  doDisplay(B00000000,B00000000,B00000000,B00010000,50);&lt;br /&gt;
  doDisplay(B00000000,B00000000,B00010000,B00000000,50);&lt;br /&gt;
  doDisplay(B00000000,B00010000,B00000000,B00000000,50);&lt;br /&gt;
  doDisplay(B00010000,B00000000,B00000000,B00000000,50);&lt;br /&gt;
  doDisplay(B00001000,B00000000,B00000000,B00000000,50);&lt;br /&gt;
  doDisplay(B00000100,B00000000,B00000000,B00000000,50);&lt;br /&gt;
  doDisplay(B10000000,B00000000,B00000000,B00000000,50);&lt;br /&gt;
*/&lt;br /&gt;
  doDisplay(B11111111,B11111111,B11111111,B11111111,500);  // turn all LEDs on for some time&lt;br /&gt;
  doDisplay(0,0,0,0,500);                                  // turn off all LEDs for some time&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
//  doDisplay(patronen[0], patronen[1] | point, patronen[2], patronen[3], 500);&lt;br /&gt;
  // de loop&lt;br /&gt;
  for (byte i=0; i&amp;lt;10; i++)&lt;br /&gt;
    doDisplay(patronen[i % 10], patronen[(i+1)%10] | point, patronen[(i+2)%10], patronen[(i+3)%10], 500);&lt;br /&gt;
    // &amp;quot;patronen[i] | point&amp;quot; also turns on the point for the given pattern by doing a bit-wise OR&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void selectDigit(byte d)&lt;br /&gt;
{&lt;br /&gt;
  for (byte i=0; i&amp;lt;4; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if (i==d)&lt;br /&gt;
    {&lt;br /&gt;
      digitalWrite(digits[i], LOW);  // LOW allows the flow of electrical current&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      digitalWrite(digits[i], HIGH);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void showPattern(byte patroon) // deze functie toont het gegeven LED patroon&lt;br /&gt;
{&lt;br /&gt;
  // set all LEDs individually, depending on the bits in the given pattern&lt;br /&gt;
  for (byte i=0; i&amp;lt;8; i++)&lt;br /&gt;
  {&lt;br /&gt;
    // &amp;quot;&amp;amp;&amp;quot; performs a bitwise AND on the numbers&lt;br /&gt;
    // &amp;gt;&amp;gt; shifts 10000000 a number of bits to the right (so &amp;quot;10000000 &amp;gt;&amp;gt; 2&amp;quot; makes &amp;quot;00100000&amp;quot;)&lt;br /&gt;
    digitalWrite(LEDs[i], patroon &amp;amp; (B10000000&amp;gt;&amp;gt;i) );&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void doDisplay(byte d0,byte d1,byte d2,byte d3,long int duration)&lt;br /&gt;
{  // duration in milli seconds&lt;br /&gt;
  unsigned long start=millis();&lt;br /&gt;
  do&lt;br /&gt;
  {&lt;br /&gt;
    // display all 4 patterns in quick succession &lt;br /&gt;
    selectDigit(0);&lt;br /&gt;
    showPattern(d0);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    selectDigit(1);&lt;br /&gt;
    showPattern(d1);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    selectDigit(2);&lt;br /&gt;
    showPattern(d2);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    selectDigit(3);&lt;br /&gt;
    showPattern(d3);&lt;br /&gt;
    delay(1);&lt;br /&gt;
  }  &lt;br /&gt;
  while (millis()-start&amp;lt;duration);  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma lijkt erg op dat van het [[Arduino - 1-digit LED Segment Display|vorige project]]. We hebben weer de twee lijsten voor de 8 pin-connecties van de plus-uiteindes van de LED's ('''byte LEDs[8];''') en die voor de patronen van de 10 cijfers '''byte patronen[10];'''. Nieuw is dat we hier ook een lijst maken van de pin-connecties van de common nul-zijden van de LED's, elk voor een van de vier digits. Deze lijst heet dan ook digits[4]. Een digit staat sowieso helemaal uit als zijn common nul HIGH is. Vervolgens definieren we een paar vaste patronen, een voor de punt, een voor het minus teken, een waarbij alle LED's van een digit aan staat en een waarvoor alles uit staat.&lt;br /&gt;
&lt;br /&gt;
In de setup() worden de lijsten weer van waarden voorzien en worden zowel de LEDs[] als de digits[] pins op OUTPUT ingesteld. Ook nu gaat dat weer handig met een for-loop. Dan staan er een paar delen uit (commentaar gemaakt). Hier worden bepaalde patronen op de digits gezet waarmee je kunt testen of alles goed werkt. Ach, het is vooral cool.&lt;br /&gt;
&lt;br /&gt;
Ook hier is de loop() functie relatief eenvoudig. Hij heeft een for-loop waarin de functie doDisplay() wordt aangeroepen met een bepaalde set patronen en een tijdsduur. Deze functie doDisplay() laat het eerste patroon zien op de eerste digit, het tweede op de tweede digit, het derde op de derde digit en het vierde op de vierde digit. Dit wordt in een for-loop herhaald tot de gewenste display tijd om is. De patronen die de for-loop aan doDisplay() worden meegegeven zijn natuurlijk cijfers uit de lijst patronen[]. De index van de lijst wordt voor elke digit berekend met formules. Hier volgt wat uitleg:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 [i % 10]      // Dit is gewoon i, maar als i groter wordt dan 10 wordt er 10 afgetrokken.&lt;br /&gt;
 [(i+1) % 10]  // Dit is i+1, maar als i+1 groter wordt dan 10 wordt er 10 afgetrokken.&lt;br /&gt;
 [(i+2) % 10]  // Dit is i+2, maar als i+2 groter wordt dan 10 wordt er 10 afgetrokken.&lt;br /&gt;
 [(i+3) % 10]  // Dit is i+3, maar als i+3 groter wordt dan 10 wordt er 10 afgetrokken.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Het teken ''%10'' betekent ''modulus''; n%10 is n waarvan zoveel keer 10 is afgetrokken als maar kan (zonder dat de uitkomst negatief wordt). Als i=0 gebruikt de loop dus patronen[0], patronen[1], patronen[2] en patronen[3]. Als i=1 gebruikt de loop patronen[1], patronen[2], patronen[3] en patronen[4]. En als i=9 gaat de modulus zijn werk doen en gebruikt de loop patronen[9], patronen[0], patronen[1] en patronen[2].&lt;br /&gt;
&lt;br /&gt;
Dit programma heeft twee nieuwe functies ten opzichte van het vorige. De eerste hebben we al genoemd doDisplay(). De andere is selectDigit() en wordt gebruikt om een patroon op de juiste digit te tonen. De functie selectDigit() heeft als parameter het nummer van de digit dat moet worden geselecteerd; selectDigit(1) zorgt dat de pin die hoort bij digit 1 LOW wordt. De pins van de andere digits worden HIGH zodat geen enkele LED daarvan aan kan gaan. Bedenk dat het hier gaat om de common nul kanten van de LEDs van elk van de digits. De functie doDisplay() krijgt de vier patronen mee als parameters en toont achter elkaar elk van deze patronen op hun respectievelijke digit. Daarvoor wordt selectDigit() aangeroepen en vervolgens showPattern() met het overeenkomstige patroon. Daarna volgt een delay() om ervoor te zorgen dat het patroon ook echt even zichtbaar wordt. Dit moet zich herhalen tot de gewenste displaytijd om is. Daarom zit dit alles ingepakt in een ''do while'' loop en begint de fuinctie met het vastleggen van de startijd.&lt;br /&gt;
&lt;br /&gt;
Je ziet dat de processor behoorlijk bezig is om dit display goed te laten werken. Er is nauwelijks tijd tussendoor voor metingen, berekeningen of andere belangrijke dingen. Ach, steeds een paar micro-seconden kan er nog wel af, maar als er millisecondes tussen komen ga je dat al snel zien. Ook legt het display een flink beslag op de beschikbare pins. Over beschikbare pins gesproken. Het is je misschien opgevallen dat pins 0 en 1 niet gebruikt zijn. Dat is niet voor niets. Deze pins worden impliciet gebruikt voor de seriele communicatie. Ze zijn prima bruikbaar als elke andere digitale pin, maar als je dat gaat doen kun je geen gebruik meer maken van de seriele communicatie met de PC. Of, als je dat wel doet, doen de pins wat anders dan wat het programma opgeeft.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
We hebben al aardig wat uit de kast gehaald om deze display goed aan het werk te krijgen in een overzichtelijk programmaatje (je zou eens op Internet moeten neuzen om te zien wat voor onhandelbare programma's anderen aanbieden ter demonstratie van dit display). Als ik dit display op mijn slaapkamer zou gebruiken als klok kom ik er achter dat het display 's nachts wel erg helder is. Terwijl het overdag best helder mag zijn heb ik het 's nachts liever wat gedimd. Zouden we zo'n dim-feature ook kunnen toevoegen? Dan kunnen we ook een lichtsensor laten bepalen hoe helder de display moet zijn om hem goed te kunnen zien. &lt;br /&gt;
&lt;br /&gt;
Denk er even over na hoe je dat zou doen. Ik stel me voor dat dit wat lastig is, dat vond ik ook, maar uiteindelijk heb ik wel een [[4-digit LED Segment Display - gedimd|oplossing]] bedacht. Als je het leuk vind kun je ff kijken.&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - 1-digit LED Segment Display|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Temperatuur meten met een DS18B20 sensor|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_1-digit_LED_Segment_Display&amp;diff=189</id>
		<title>Arduino - 1-digit LED Segment Display</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_1-digit_LED_Segment_Display&amp;diff=189"/>
				<updated>2020-12-07T11:20:34Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Beetje spelen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Een Segment Display===&lt;br /&gt;
Een segment display bevat een aantal langwerpige elementen, meestal LED's, die voornamelijk bedoeld zijn om cijfers weer te geven, maarin principe kunnen er ook eenvoudige letters mee worden gemaakt. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:105px-Seven_segment_display-animated.gif|155px]]&lt;br /&gt;
|-&lt;br /&gt;
|Cijfers en primitieve letters in een segment display&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Het display uit bovenstaand voorbeeld heeft 8 LED's: drie horizontale streepjes, twee vertikale streepjes boven, twee vertikale streepjes onder en de punt. Elk ''segment'' kan apart worden aan- en uitgezet. Bij de aansturing van een segment display ontstaan de cijfers (en letters) door de juiste combinatie van segmenten aan te zetten. De pootjes van zo'n display zijn verbonden met de 8 individuele LEDjes, terwijl er meestal een gemeenschappelijke plus is (common annode), of juist een gemeenschappelijke min (common cathode). Hoewel ze in principe gelijkwaardig zijn, werkt een common cathode iets gemakkelijker omdat de LEDjes daarvan aangaan als de plus-kant van dat LEDje hoog wordt. Bij een common annode is het plus signaal altijd aanwezig en gaat een LEDje juist aan als de andere kant laag wordt. Voor veel mensen is dat net iets minder logisch. Een 8 segment display, zoals boven, heeft dus 8 connecties voor elke LED plus een common annode (plus) of cathode (min). &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:SegmentDisplay_CC_PinConfig.png|350px]]&lt;br /&gt;
|-&lt;br /&gt;
|Common Cathode Segment Display - pin cofiguratie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De letters geven aan om welke LED het gaat. Zet je bijvoorbeeld a,b,c,d en g aan, dan krijg je het cijfer 3. De punt is verbonden met pootje 5. Net als bij andere LED's moet de stroom door de LED's van een segment display worden beperkt met een weerstand. Je moet dan voor elke LED een eigen weerstand gebruiken omdat de LED-jes anders elkaar beinvloeden. Zie je overigens dat zowel pootje 3 als 8 aan de common cathode zitten? Het volstaat dus om een van de twee pootjes met de nul te verbinden.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 1-digit segment display met common cathode (= gemeenschappelijke min)&lt;br /&gt;
*8 weerstanden van 180Ω-220Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:1DigitSegmentDisplay.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Schakeling voor 1 digit segment display&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
Het volgende programma bevat een paar nieuwe elementen. Upload het eerst maar naar je Arduino. Het wordt hieronder in detail besproken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
byte LEDs[8];          // lijst met alle LED-pins a,b,c,d,e,f,g, en de punt&lt;br /&gt;
byte patronen[10];     // lijst met bit patronen voor alle cijfers, de punt, en de '-'&lt;br /&gt;
byte point=B00000001;  // de punt&lt;br /&gt;
byte minus=B00000010;  // de &amp;quot;-&amp;quot;&lt;br /&gt;
int wachttijd = 100;   // tijdsduur van elk cijfer&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // maak een lijstje van de LED pins in volgorde van hun functie (functies 'a', 'b', etc) &lt;br /&gt;
  LEDs[0]=7;  // a - zit aan pin 7 van de Arduino&lt;br /&gt;
  LEDs[1]=6;  // b - zit aan pin 6 van de Arduino&lt;br /&gt;
  LEDs[2]=5;  // c - etc.&lt;br /&gt;
  LEDs[3]=10; // d&lt;br /&gt;
  LEDs[4]=11; // e&lt;br /&gt;
  LEDs[5]=8;  // f&lt;br /&gt;
  LEDs[6]=9;  // g&lt;br /&gt;
  LEDs[7]=4;  // punt&lt;br /&gt;
  // vul de tabel met aan/uit patronen voor elk van de cijfers&lt;br /&gt;
  // &amp;quot;B&amp;quot; is de &amp;quot;binary formatter&amp;quot;: B10000010 =&amp;gt; alleen het eerste en een-na-laatste bit staan aan&lt;br /&gt;
  // het eerste bit is voor de &amp;quot;a&amp;quot; LED, het tweede voor de &amp;quot;b&amp;quot; LED, enz. Het laatste is voor de punt&lt;br /&gt;
  // pattern = Babcdefgp;&lt;br /&gt;
  patronen[ 0]=B11111100;&lt;br /&gt;
  patronen[ 1]=B01100000;&lt;br /&gt;
  patronen[ 2]=B11011010;&lt;br /&gt;
  patronen[ 3]=B11110010;&lt;br /&gt;
  patronen[ 4]=B01100110;&lt;br /&gt;
  patronen[ 5]=B10110110;&lt;br /&gt;
  patronen[ 6]=B10111110;&lt;br /&gt;
  patronen[ 7]=B11100000;&lt;br /&gt;
  patronen[ 8]=B11111110;&lt;br /&gt;
  patronen[ 9]=B11110110;&lt;br /&gt;
  // zet alle LED-pins op output mode&lt;br /&gt;
  for (int i=0; i&amp;lt;8; i++)&lt;br /&gt;
    pinMode(LEDs[i],OUTPUT);&lt;br /&gt;
  // test patroon&lt;br /&gt;
  for (int i=0; i&amp;lt;4; i++)&lt;br /&gt;
  {&lt;br /&gt;
    byte patroon = B10000000;&lt;br /&gt;
    for (byte j=0; j&amp;lt;6; j++)&lt;br /&gt;
    {&lt;br /&gt;
      showPattern(patroon &amp;gt;&amp;gt; j);  // schuif patroon j plekken naar rechts&lt;br /&gt;
      delay(50);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  showPattern(B11111111);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void showPattern(byte patroon) // deze functie toont het gegeven LED patroon&lt;br /&gt;
{&lt;br /&gt;
  byte first = B10000000;  // the first bit that refers to LED &amp;quot;a&amp;quot;&lt;br /&gt;
  for (byte i=0; i&amp;lt;8; i++)&lt;br /&gt;
    // &amp;quot;&amp;gt;&amp;gt;&amp;quot; shifts B10000000 a number of bits to the right (so &amp;quot;B10000000 &amp;gt;&amp;gt; 2&amp;quot; makes &amp;quot;B00100000&amp;quot;)&lt;br /&gt;
    // &amp;quot;&amp;amp;&amp;quot; performs a bitwise AND on the numbers&lt;br /&gt;
    digitalWrite(LEDs[i], patroon &amp;amp; (first&amp;gt;&amp;gt;i) ); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=9; i&amp;gt;=0; i--)&lt;br /&gt;
  {&lt;br /&gt;
    showPattern(patronen[i]);&lt;br /&gt;
    delay(wachttijd);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het eerste statement begint al met iets nieuws: '''byte LEDs[8];''' maakt ''LEDs'' geen gewone variabele van het type byte, maar een '''lijst''' van 8 bytes. LEDs[0] is dan de eerste byte uit die lijst, LEDs[1] de tweede, en zo voort, zodat de laatste LEDs[7] is. Met een enkel statement kunnen we dus een hoop variabelen definieren. Daarbij zijn die variabelen via een loop om beurten te benaderen. Daar komen we later op terug. Het tweede statement is nu beter te begrijpen: het definieert tien bytes in een statement '''byte patronen[10];'''. &lt;br /&gt;
Regel drie lijkt een gewone byte te definieren met de naam '''point'''. Maar de waarde van die byte is doet vreemd aan: '''B00000001'''. Met die '''B''' wordt bedoeld dat de waarde '''binair''' wordt opgegeven. We zijn gewend om waarden decimaal op te geven, 12, 349, en zo voort. Omdat het hier om een byte gaat, bestaat elke waarde in de processor uit 8 eentjes en nulletjes, en dat is nu precies wat we met Bxxxxxxxx doen: elk eentje en nulletje wordt opgegeven. Voor de processor maakt het niet uit of je '''12''' opgeeft, of '''B00001100''' - van binnen is het exact hetzelfde. De punt bestaat dus uit allemaal nullen, behalve de laatste ''bit'' die 1 is.&lt;br /&gt;
&lt;br /&gt;
In de setup() worden de lijsten van waarden voorzien. De lijst LEDs[] geeft precies aan welk LEDje aan welke pin van de Arduino zit. LEDs[0] is dus de pin van de LED die overeenkomt met positie ''a'' van het segment display. LEDs[1] is de pin van positie ''b'', en zo voort. In het commentaar staat ''Babcdefgp'': waarmee wordt aangegeven dat de eerste bit voor ''a'' is, de tweede voor ''b'', en zo voort. De lijst patronen[] wordt helemaal gevuld met waarden die bitsgewijs worden opgegeven. Door dat bitgewijs opgeven van de getallen kun je heel gemakkelijk opgeven welke LEDjes er aan moeten staan voor elk patroon. Zo zie je dat voor patroon[0] alle LEDjes behalve de laatste twee aan staan. Als je nu kijkt naar de pin-configuratie kun je waarschijnlijk snel zien dat het hier gaat om het cijfer ''0''. Met een beetje moeite kun je ook de andere cijfers herkennen. De lijst ''patronen[]'' geeft dus aan welke LEDjes er aan en uit moeten staan voor elk van de cijfers.&lt;br /&gt;
&lt;br /&gt;
Het volgende deel van de setup() zet alle pins van de LED's op output mode. Dit gaat met een for-loop waarbij de loop-variabele ''i'' wordt gebruikt om alle LEDs langs te lopen.&lt;br /&gt;
&lt;br /&gt;
Dan volgt er een stukje code waarmee alle lampjes om beurten snel achter elkaar worden aangezet. Dan volgt er een for-loop die 4 keer wordt doorlopen. Eerst wordt er een byte gedefinieerd met alleen een 1 op de positie van LED ''a''. In de for-loop die volgt worden patronen op de pins van de Arduino gezet met de functie showPattern(). Het bijzondere is dat er geen vast patroon wordt meegegeven met deze functie, maar een patroon dat wisselt met j. de parameter is namelijk ''patroon &amp;gt;&amp;gt; j''. Dit ''&amp;gt;&amp;gt;'' teken staat ervoor dat patroon j plaatsen naar rechts opschuift. Als we beginnen met B10000000 en we schuiven dat 3 plaatsen op (j is dan 3), dan krijgen we patroon B00010000. Dit is dan het patroon dat wordt doorgegeven aan showPattern() functie.&lt;br /&gt;
&lt;br /&gt;
Tenslotte worden alle lichtjes gedurende een seconde aangezet door aanroep van de showPattern() functie met B11111111 als parameter.&lt;br /&gt;
&lt;br /&gt;
De loop() functie is relatief eenvoudig. In een for loop, die van 9 naar 0 aftelt, wordt showPattern() aangeroepen met patronen[i], waarna het programma ''wachttijd'' pauzeert. Het resultaat zal dus zijn dat het display steeds opnieuw aftelt van 9 naar 0.&lt;br /&gt;
&lt;br /&gt;
Blijft over om de werking van de functie showPattern() uit te leggen. Gelukkig heeft de functie maar twee statements. Het eerste statement is gemakkelijk: de byte ''first'' wordt definieerd met een patroon waarvan alleen het eerste bit aan staat. Daarna volgt een for-loop waarbij i oploopt van 0 tot en met 7 (kleiner dan 8) en waarbinnen een digitalWrite() plaatsvindt op pin LEDs[i]. Dat is dus de pin van de i-de LED van het display. Omdat het een digitalWrite() is, wordt naar die LED natuurlijk een 1 of een 0 gestuurd. Laten we eerst vaststellen dat ''(first&amp;gt;&amp;gt;i)'' een patroon is waarvan precies één bit aan staat en wel bit i+1. Als i=0 is het gewoon de byte ''first''. Als i=1 is het de byte B01000000 (tweede bit staat aan). Bij i=2 wordt het byte B00100000 (derde bit staat aan). En zo voort. Net als in de ''setup()'' wordt dit gedaan door de ''&amp;gt;&amp;gt;'' operator die de byte een aantal posities naar rechts opschuift. Deze byte wordt vervolgens gecombineerd met het patroon dat als parameter wordt meegegeven aan de functie. Die combinatie wordt gemaakt met het '&amp;amp;' teken dat wijst op een ''bitwise AND''. Er ontstaat dan een nieuwe byte die op elke positie alleen een 1 heeft als beide ''operanden'' op die positie een 1 hebben. Die operanden zijn dus ''patroon'' en ''(first&amp;gt;&amp;gt;i)''. Van die laatste weten we inmiddels dat precies een bit 1 is en alle anderen 0 zijn. Het resultaat van ''patroon &amp;amp; (first&amp;gt;&amp;gt;i)'' is dan ook een byte die alleen groter zal zijn dan 0 als de i-de bit van patroon ook een 1 is. Als het resultaat ongelijk is aan 0 geldt dat als digitale 1. LEDs[i] zal daardoor aan worden gezet als de overeenkomstige bit in ''patroon'' 1 is en anders wordt de LED uit gezet. Het resultaat is dus dat de LEDs worden aan- en uitgezet volgens het opgegeven patroon. En dat heel compact en efficient geprogrammeerd.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Als je hier wat wilt spelen kun je de teller omkeren: in plaats van aftellen gaat hij dan van 0 naar 9. Leuker is het wellicht om hem te laten aftellen en bij 0 aangekomen alle lampjes een paar keer snel aan en uit te laten gaan. &lt;br /&gt;
&lt;br /&gt;
Zoals uitgelegd zijn de cijfers als patronen gedefinieerd. Maar je kunt op dezelfde manier ook andere patronen maken, zoals de letters van het alfabet. Onderstaand zie je een voorbeeld van hoe je cijfers en de meeste letters zou kunnen maken met dit display (met soms een kleine in plaats van een hoofdletter). Met al deze patronen kun je het programma ook woorden laten spellen. Eventueel kun je de nog ontbrekende letters ook toevoegen, maar dan wordt de X al snel hetzelfde als de H (tenzij je een kleine letter h gebruikt) en de V hetzelfde als de U. Tja, voor het alfabet blijft het met dit display een beetje behelpen. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:letter_display.jpg|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Cijfers en letters in het segment display&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Allerlei sensoren|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - 4-digit LED Segment Display|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:Letter_display.jpg&amp;diff=188</id>
		<title>File:Letter display.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:Letter_display.jpg&amp;diff=188"/>
				<updated>2020-12-07T11:08:00Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Main_Page&amp;diff=187</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Main_Page&amp;diff=187"/>
				<updated>2020-12-07T10:24:56Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Arduino cursus ==&lt;br /&gt;
Veel plezier met de Arduino cursus die [[Arduino_cursus|hier]] begint.&lt;br /&gt;
&lt;br /&gt;
== Wiki onderhoud ==&lt;br /&gt;
&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Passive_buzzer&amp;diff=186</id>
		<title>Arduino - Passive buzzer</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Passive_buzzer&amp;diff=186"/>
				<updated>2020-12-07T10:21:23Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Navigatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In een vorig projectje hebben we '''active buzzer''' al gezien. Dat elementje piept vanzelf als er spanning op wordt gezet. De '''pasive buzzer''' maakt alleen geluid als je de invoer spanning snel laat wisselen. Het voordeel daarvan is dat je de toonhoogte kunt aanpassen, maar de Arduino moet dan het werk doen. &lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 (passive) buzzer&lt;br /&gt;
*1 potmeter&lt;br /&gt;
&lt;br /&gt;
Onderstaande schakeling is erg eenvoudig en snel in elkaar te zetten.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Passive_buzzer.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Verbindingen in het breadboard met een bijbehorende schema tekening&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
Om geluid uit de passive buzzer te krijgen moet het programma de buzzer continu aan en uit zetten met de gewenste frequentie. Dat gebeurt door de betreffende pin (pin 6) aan en uit te zetten. In principe kun je ook een PWM signaal gebruiken met voldoende breedte (pin 6 heeft ook PWM). Als je bijvoorbeeld 128/255 zou gebruiken is de spanning de helft van de tijd hoog en de andere helft laag. Met een PWM signaal kunnen we de buzzer alleen aan- en uitzetten; de frequentie wordt dan bepaald door de ingebakken frequentie van de PWM elektronica. In plaats van die ingebouwde frequentie willen we de frequentie laten bepalen door de stand van de potmeter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int buzzerpin = 6; // aansluitpin van de buzzer&lt;br /&gt;
int pot_pin = 0;   // A0 is the analog input pin for the potmeter&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(buzzerpin, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  int freq = 5 * digitalRead(pot_pin);  &lt;br /&gt;
  // de frequentie is nu 5x de uitgelezen waarde&lt;br /&gt;
  // de potmeter geeft een waarde tussen 0 en 1023, dus de frequentie loopt zo van 0 tot 5 kHz&lt;br /&gt;
  // elke seconde freq pulsen =&amp;gt; elke puls duurt dan 1/freq seconden&lt;br /&gt;
  // de spanning moet dan steeds een halve puls aan en een halve puls uit&lt;br /&gt;
  int wait = 1000000/freq/2;    // wait is de helft van een puls - in micro-seonden!!&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(buzzerpin,HIGH); // signaal hoog&lt;br /&gt;
  delayMicroseconds(wait);      // wacht halve periode  - delayMicroseconds() wacht microseconden (1-miljoenste seconde)&lt;br /&gt;
  digitalWrite(buzzerpin,LOW);  // signaal laag&lt;br /&gt;
  delayMicroseconds(wait-100);  // wacht andere helft periode - minus 100 microseconde ter compensatie van analogRead()&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg van het programma===&lt;br /&gt;
De setup() functie hoeft niet te worden uitgelegd. De loop() functie leest als eerste de waarde uit van de potmeter. Dat is een getal tussen 0 en 1023. Door dit met 5 te vermenigvuldigen krijgen we een getal tussen de 0 en 5115. Dit is ''freq'': de gewenste frequentie of toonhoogte die dus tussen de 0 en 5 kHz ligt (''kHz'' is ''kilo Herz'', ofwel ''duizend Herz'', waarbij Herz het aantal trillingen per seconde is). Om die frequentie te realiseren moet het signaal elke seconde ''freq'' keer aan- en uitgezet worden. Elke keer aan- en uitzetten moet dus 1/freq seconde duren. Bij een frequentie van 5 kHz duurt zo'n periode dus maar 1/5000 seconde. Dat is maar 1/5de van een microseconde! De delay() functie wacht steeds een aantal microseconden en dat is nu veel te lang. Daarom gebruiken we hier een andere delay functie: delayMicroseconds() die het opgegeven aantal microseconden wacht. Een microseconde is 1/1000ste van een milliseconde, ofwel, een miljoenste van een seconde. 1/freq seconde is 1000000/freq microseconde. De helft van die periode moet het signaal hoog zijn en de andere helft laag. Dat is wat we zien: &lt;br /&gt;
&lt;br /&gt;
int wait = 1000000/freq/2;&lt;br /&gt;
&lt;br /&gt;
De processor in de Arduino UNO werkt op 16 MHz en kan dus 16 miljoen keer per seconde een micro-taakje uitvoeren. Dat is snel genoeg om microseconden te kunnen wachten en tussendoor ongemerkt simpele sommetjes te maken. Maar toch zit er nog een verborgen probleem in het programma. De analogRead() functie heeft namelijk heel veel micro-taakjes uit te voeren voor hij met resultaat komt. In de praktijk duurt een analogRead() ongeveer 100 microseconde!! Dat is zoveel tijd dat we er in het programma rekening mee moeten houden, omdat gedurende de analogRead() pin 6 steeds LOW is. Daarom staat er in de tweede delayMicroseconds(wait-100).&lt;br /&gt;
&lt;br /&gt;
Elke keer als tijdsduur echt belangrijk is moet je even naar je programma kijken of er dit soort problemen in kunnen zitten. Vooral analogRead() is wat dat betreft een &amp;quot;dure&amp;quot; functie, maar ook het zwaardere rekenwerk kan natuurlijk veel tijd vergen. Je kunt desnoods ook meten hoe lang een bepaald stuk van je programma duurt door via de serial monitor tijdsinformatie terug te sturen. De micros() functie is dan heel behulpzaam omdat die het aantal microseconde na de laatste reset van de Arduino teruggeeft. Het resultaat is een '''unsigned long''': een type variabele dat veel grotere getallen aankan dan de door ons veel gebruikte '''int'''.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
*Eerder gaven we aan dat je ook met een PWM signaal van bijv 128/255 een geluid moet kunnen produceren met de buzzer. De toonhoogte is dan een afspiegeling van de ingebakken frequentie van de PWM. Door dit nu te doen kun je een idee krijgen van die ingebouwde PWM frequentie van de Arduino. Kun jij erachter komen wat die frequentie ongeveer is?&lt;br /&gt;
*Eerlijk gezegd hebben we wel wat moeilijk zitten doen in dit project. De toonhoogte hebben we afgesteld met loops en wachttijden, terwijl het Arduino platform hiervoor een heel handige functie biedt: tone(). deze functie heeft twee parameters, pin en frequentie, waarmee heel gemakkelijk een toon kan worden weergegeven. Dit werkt op alle digitale pins en dus niet alleen op PWM pins. Probeer het volgende programmaatje maar eens en kijk dan of je begrijpt hoe het werkt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int buzzerpin = 6;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(buzzerpin, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=10; i&amp;lt;4000; i++)&lt;br /&gt;
    tone(buzzerpin,i);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - RGB LED|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Het 1602 LCD Display|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=185</id>
		<title>Arduino - Temperatuur meten met een DS18B20 sensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=185"/>
				<updated>2020-12-07T10:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Uitleg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperatuur kan op vele manieren worden gemeten, vaak met erg goedkope sensoren. In [[Arduino - Allerlei sensoren|Allerlei sensoren]] hebben we gezien hoe je een NTC kunt gebruiken, maar dat het lastig kan zijn om daarmee nauwkeurige metingen te doen. Met een LM35 gaat het al een stuk gemakkelijker maar wordt lang niet het hele volt-bereik gebruikt waardoor de meting minder precies zal zijn. Ook moet je speciale maatregelen nemen om te meten bij vorst. De Pt100 is een uitstekende sensor die ook industrieel vaak wordt toegepast, maar die voor een goede meting wel extra componenten nodig heeft om een signaal te krijgen dat voor een Arduino goed meetbaar is. In dit project zullen we een digitale sensor gebruiken die heel goed samenwerkt met het Arduino platform.&lt;br /&gt;
&lt;br /&gt;
===De DS18B20===&lt;br /&gt;
De DS18B20 sensor is, zoals de titel al aangeeft, een digitale sensor: je hoeft geen spanning te meten die je moet omrekenen naar een temperatuur, maar je ontvangt de meetwaarde direct in digitale vorm. De DS18B20 heeft daarbij een nauwkeurigheid van 0,5°C en is, als het goed is, in de fabriek al gecalibreerd. Weliswaar is een DS18B20 iets duurder dan een LM35 of een elementaire NTC, maar de prijs blijft toch meestal onder de €3,00. De grootste voordelen zijn dat de sensor niet gecalibreerd hoeft te worden en dat de meetwaarde onafhankelijk is van de exacte voedingsspanning, die mag varieren tussen de 3,0V en 5,5V. Daarbij kan een Arduino uitstekend communiceren met de sensor via een seriele lijn. Een extra pluspunt is dat je meerdere sensoren kunt uitlezen via dezelfde seriele verbinding en je dus meer pins over houdt voor andere dingen. Het meetbereik van de sensor is van -55°C tot 125°C.&lt;br /&gt;
&lt;br /&gt;
De DS18B20 heeft drie aansluitingen: een voor de plus, een voor aarde (de nul), en een derde voor het seriele signaal. De sensor is er in meerdere uitvoeringsvormen. De meest elementaire vorm lijkt erg op een transistor (net als de LM35). Er is ook een DIL-chip en hij wordt veel verkocht in een vorm waarbij de sensor is ondergebracht in een waterdichte behuizing (metalen kokertje) en een kabel met drie aansluitdraden. In die laatste vorm is er meestal een rode draad voor de plus, een zwarte voor de nul, terwijl de signaaldraad meestal geel is. In dit project zullen we de sensor op de normale manier aansluiten waarbij alle drie de aansluitingen worden gebruikt. Er is ook een &amp;quot;parasite mode&amp;quot; waarbij de sensor functioneert met slechts twee aansluitdraden. In dat geval wordt de benodigde voeding ''afgesnoept'' van het seriele signaal.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_uitvoeringsvormen.png|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Diverse uitvoeringsvormen van de DS18B20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS18B20 sensor&lt;br /&gt;
*1 weerstand van 4k7Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS18B20 aansluiten op digitale pin 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
byte Resolution = 10;  // 9, 10, 11, 12&lt;br /&gt;
//  9 bit: max  94 ms - hele graden&lt;br /&gt;
// 10 bit: max 188 ms - halve graden&lt;br /&gt;
// 11 bit: max 375 ms - kwart graden&lt;br /&gt;
// 12 bit: max 750 ms - 1/8ste graden - default&lt;br /&gt;
&lt;br /&gt;
// Data wire is plugged into pin 2 on the Arduino &lt;br /&gt;
#define ONE_WIRE_BUS 2 &lt;br /&gt;
&lt;br /&gt;
// Setup a oneWire instance to communicate with any OneWire devices  &lt;br /&gt;
// (not just Maxim/Dallas temperature ICs) &lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
// Pass our oneWire reference to Dallas Temperature. &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
void setup(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;Dallas Temperature IC Control Library Demo&amp;quot;); &lt;br /&gt;
  byte addr[8];&lt;br /&gt;
  TempSensor.getAddress(addr,0);&lt;br /&gt;
  TempSensor.setResolution(addr,Resolution);  // 9, 10, 11, or 12&lt;br /&gt;
  Serial.print(&amp;quot;Actual resolution = &amp;quot;); &lt;br /&gt;
  Serial.println(TempSensor.getResolution(addr));&lt;br /&gt;
  TempSensor.begin(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.print(&amp;quot; Requesting temperatures...&amp;quot;);&lt;br /&gt;
  unsigned long start = micros(); &lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  float duration = (micros() - start)/1000000.0;&lt;br /&gt;
  Serial.print(&amp;quot;Temperature is: &amp;quot;); &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?  &lt;br /&gt;
  Serial.print(&amp;quot; (took &amp;quot;); &lt;br /&gt;
  Serial.print(duration,3);&lt;br /&gt;
  Serial.println(&amp;quot; seconds)&amp;quot;); &lt;br /&gt;
  // You can have more than one DS18B20 on the same bus.  &lt;br /&gt;
  // 0 refers to the first IC on the wire &lt;br /&gt;
  delay(1000-TempSensor.millisToWaitForConversion(Resolution)); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LET OP'''&lt;br /&gt;
&lt;br /&gt;
Bovenstaand programma gebruikt twee ''libraries'' die met de #include regels worden opgenomen. Dit hebben we eerder gezien bij bijvoorbeeld [[Arduino - Het 1602 LCD Display|Het 1602 LCD project]] waar de LiquidCrystal library werd gebruikt. Het is me gebleken dat de libraries die we hier nodig hebben, OneWire en DallasTemperature, niet altijd beschikbaar zijn. Als die libraries er niet zijn krijg je een foutmelding. In dat geval moeten ze eerst worden geinstalleerd. Dat kan gelukkig toch wel vrij gemakkelijk. Ga daarvoor in de Arduino app naar het '''Tools''' menu en kies dan voor '''Manage libraries...'''. Als je dan zoekt op ''DallasTemperature'' of op ''DS18B20'', dan vind je de juiste library (van Miles Burton en anderen). Klik op de library en klik dan op de '''Install''' knop. Hetzelfde doe je vervolgens voor de ''OneWire'' library (van Jim Studt en anderen). Ook selecteren en installeren. Daarna moet bovenstaand programma werken. Je kunt ook op andere manieren libraries installeren en op die manier libraries gebruiken die niet via het menu zijn te vinden. Als je daar meer over wilt weten kijk dan eens [[https://www.arduino.cc/en/guide/libraries hier]] (in het Engels).&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma communiceert via een seriele verbinding digitaal met de sensor. We kunnen alle details van die communicatie in onze code programmeren, maar in dit soort gevallen is het veel aantrekkelijker om daaroor een library te gebruiken. Hier gebruiken we twee libraries:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let op dat deze statements niet worden afgesloten met een '';''. De ''OneWire'' library bevat de benodigde code van het OneWire communicatie protocol dat de DS18B20 sensor gebruikt. De tweede library maakt het mogelijk om via het OneWire protocol commando's naar de sensor te sturen en informatie uit te lezen. &lt;br /&gt;
Met het statement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define ONE_WIRE_BUS 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wordt de pin vastgelegd die de Arduino gebruikt om via het OneWire protocol met de sensor te ''praten''. De signaaldraad van de sensor moet dus verbonden zijn met pin 2. Overigens kan de Arduino via dezelfde verbinding met meerdere sensoren praten zolang die maar allemaal het OneWire protocol gebruiken. Merk op dat dit een gewone digitale pin is en niet een van de twee pins die de normale seriele communicatie gebruikt (dat zijn pins 0 en 1). &lt;br /&gt;
Daarna worden er twee objecten gemaakt. Het eerste is het OneWire object. Een ''object'' is een software structuur die zich laat aanspreken als ware het de hardware zelf. Objecten hebben allerlei handige functies die horen bij het type object waar het over gaat. Het oneWire object is van het type OneWire (let op de eerste hoofdletter) en heeft functies aan boord die het communiceren gemakkelijker maken. Het TempSensor object is van het type DallasTemperature en heeft functies aan boord om die sensor aan te sturen en uit te lezen. Het is belangrijk om te zien dat dit object een OneWire object nodig heeft. Dit object wordt als parameter doorgegeven aan het TempSensor object via ''&amp;amp;oneWire''. Dat ''&amp;amp;'' teken geeft aan op welke wijze het wordt doorgegeven - het is nu nog te vroeg om daar dieper op in te gaan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De code om deze objecten te maken staat allemaal in de libraries. Daar hebben we geen omkijken naar, al moeten we wel weten welke functies er zijn en hoe die aangeroepen moeten worden. Daarvoor moet je in de documentatie van de libraries zoeken en vaak moet je het een en ander proberen. Je kunt vaak ook voorbeelden vinden die heel illustratief zijn.&lt;br /&gt;
De ''setup()'' functie start een seriele communicatie zodat we de temperatuur kunnen aflezen op de Serial Monitor. De ''setup()'' stelt ook de resolutie in van de sensor. De DS18B20 kan een snelle maar onnauwkeurige meting doen in 9 bits (alleen hele graden), of een nauwkeurigere maar veel langzamere meting in 12 bits (in achsten van een graad). De variabele ''Resolution'' bepaald dit en wij hebben die ingesteld op 10 bits (dit geeft een resolutie van 0,5 graden). Om die resolutie in te stellen hebben we het adres van de sensor nodig. Dat wordt eerst uitgelezen door de functie ''TempSensor.getAddress()'' aan te roepen. Hier wordt het volgnummer van de sensor als parameter opgegeven omdat er meerdere sensoren op de OneWire bus kunnen zitten. Nu hebben we maar een sensor en dus is dat volgnummer 0. De adres variabele moet overigens een lijst met 8 bytes zijn. Vervolgens wordt de resolutie van de sensor op dit adres ingesteld op de gewenste waarde met ''TempSensor.setResolution()''. Voor de zekerheid lezen we de ingestelde resolutie nog een keer uit met ''TempSensor.getResolution(addr)'' en geven die resolutie weer op de Serial Monitor. De setup() functie doet dus veel meer dan nodig, maar voor hier is dat leerzamer. &lt;br /&gt;
In de loop() functie is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
het belangrijkste. De aanroep ''TempSensor.requestTemperatures()'' vraagt om de meting te starten. Die meting kost tijd en het programma wacht tot de sensor klaar is. Intussen kan er dus niets anders worden gedaan. Vervolgens kan de temperatuur worden uitgelezen via ''TempSensor.getTempCByIndex(0)''. De uitgelezen waarde wordt meteen ook weergegeven op de Serial Monitor. De index ''0'' is nodig omdat het TempSensor object meerdere sensoren kan bedienen. In ons geval is dat er maar een, maar je kunt prima 5 temperatuur sensoren aan een OneWire bus hangen. Rond deze kern wordt een tijdmeting gedaan om te zien hoeveel tijd de temperatuurmeting kostte. Als je de resolutie verandert zul je zien dat de benodigde tijd afhangt van de ingestelde resolutie. Tenslotte wordt even gewacht zodat er ongeveer 1 meting per 5 seconden wordt gedaan. De wachttijd is afhankelijk van de vereiste resolutie en wordt gecorrigeerd voor de meettijd via ''TempSensor.millisToWaitForConversion(Resolution)''. &lt;br /&gt;
&lt;br /&gt;
Zoals je kunt zien krijg je de temperatuur in graden Celsius. Dat is voor ons prettig, maar in Dallas zien ze het natuurlijk liever in Fahrenheit (belachelijk, maar daar schijnen ze erg gehecht te zijn aan hun onhandige eenheden). Maar niet getreurd: met deze library kan dat ook. In plaats van ''getTempCByIndex'' gebruik je dan ''getTempFByIndex''.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
We hebben al een paar keer gemeld dat het OneWire protocol toelaat om de Arduino via een en dezelfde signaal pin met meerdere sensoren te laten praten. Je kunt dus meerdere temperaturen uitlezen via een pin! Als je beschikt over een extra DS18B20 is het de moeite om dat eens te proberen. Onderstaande schakeling geeft aan hoe de sensoren aangesloten moeten worden op de plus, min en signaal pin. Let op dat er maar een weerstand nodig is van 4k7Ω. Dit is dan ook de reden dat de weerstand niet al zit ingebouwd in de sensor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_multi-schakeling.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|Het aansluiten van meerdere DS18B20 sensoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Kun jij het programma zo aanpassen dat je alle sensoren kunt uitlezen?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - 4-digit LED Segment Display|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Een digitale clock|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=184</id>
		<title>Arduino - Temperatuur meten met een DS18B20 sensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=184"/>
				<updated>2020-12-07T10:12:24Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Uitleg */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperatuur kan op vele manieren worden gemeten, vaak met erg goedkope sensoren. In [[Arduino - Allerlei sensoren|Allerlei sensoren]] hebben we gezien hoe je een NTC kunt gebruiken, maar dat het lastig kan zijn om daarmee nauwkeurige metingen te doen. Met een LM35 gaat het al een stuk gemakkelijker maar wordt lang niet het hele volt-bereik gebruikt waardoor de meting minder precies zal zijn. Ook moet je speciale maatregelen nemen om te meten bij vorst. De Pt100 is een uitstekende sensor die ook industrieel vaak wordt toegepast, maar die voor een goede meting wel extra componenten nodig heeft om een signaal te krijgen dat voor een Arduino goed meetbaar is. In dit project zullen we een digitale sensor gebruiken die heel goed samenwerkt met het Arduino platform.&lt;br /&gt;
&lt;br /&gt;
===De DS18B20===&lt;br /&gt;
De DS18B20 sensor is, zoals de titel al aangeeft, een digitale sensor: je hoeft geen spanning te meten die je moet omrekenen naar een temperatuur, maar je ontvangt de meetwaarde direct in digitale vorm. De DS18B20 heeft daarbij een nauwkeurigheid van 0,5°C en is, als het goed is, in de fabriek al gecalibreerd. Weliswaar is een DS18B20 iets duurder dan een LM35 of een elementaire NTC, maar de prijs blijft toch meestal onder de €3,00. De grootste voordelen zijn dat de sensor niet gecalibreerd hoeft te worden en dat de meetwaarde onafhankelijk is van de exacte voedingsspanning, die mag varieren tussen de 3,0V en 5,5V. Daarbij kan een Arduino uitstekend communiceren met de sensor via een seriele lijn. Een extra pluspunt is dat je meerdere sensoren kunt uitlezen via dezelfde seriele verbinding en je dus meer pins over houdt voor andere dingen. Het meetbereik van de sensor is van -55°C tot 125°C.&lt;br /&gt;
&lt;br /&gt;
De DS18B20 heeft drie aansluitingen: een voor de plus, een voor aarde (de nul), en een derde voor het seriele signaal. De sensor is er in meerdere uitvoeringsvormen. De meest elementaire vorm lijkt erg op een transistor (net als de LM35). Er is ook een DIL-chip en hij wordt veel verkocht in een vorm waarbij de sensor is ondergebracht in een waterdichte behuizing (metalen kokertje) en een kabel met drie aansluitdraden. In die laatste vorm is er meestal een rode draad voor de plus, een zwarte voor de nul, terwijl de signaaldraad meestal geel is. In dit project zullen we de sensor op de normale manier aansluiten waarbij alle drie de aansluitingen worden gebruikt. Er is ook een &amp;quot;parasite mode&amp;quot; waarbij de sensor functioneert met slechts twee aansluitdraden. In dat geval wordt de benodigde voeding ''afgesnoept'' van het seriele signaal.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_uitvoeringsvormen.png|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Diverse uitvoeringsvormen van de DS18B20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS18B20 sensor&lt;br /&gt;
*1 weerstand van 4k7Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS18B20 aansluiten op digitale pin 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
byte Resolution = 10;  // 9, 10, 11, 12&lt;br /&gt;
//  9 bit: max  94 ms - hele graden&lt;br /&gt;
// 10 bit: max 188 ms - halve graden&lt;br /&gt;
// 11 bit: max 375 ms - kwart graden&lt;br /&gt;
// 12 bit: max 750 ms - 1/8ste graden - default&lt;br /&gt;
&lt;br /&gt;
// Data wire is plugged into pin 2 on the Arduino &lt;br /&gt;
#define ONE_WIRE_BUS 2 &lt;br /&gt;
&lt;br /&gt;
// Setup a oneWire instance to communicate with any OneWire devices  &lt;br /&gt;
// (not just Maxim/Dallas temperature ICs) &lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
// Pass our oneWire reference to Dallas Temperature. &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
void setup(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;Dallas Temperature IC Control Library Demo&amp;quot;); &lt;br /&gt;
  byte addr[8];&lt;br /&gt;
  TempSensor.getAddress(addr,0);&lt;br /&gt;
  TempSensor.setResolution(addr,Resolution);  // 9, 10, 11, or 12&lt;br /&gt;
  Serial.print(&amp;quot;Actual resolution = &amp;quot;); &lt;br /&gt;
  Serial.println(TempSensor.getResolution(addr));&lt;br /&gt;
  TempSensor.begin(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.print(&amp;quot; Requesting temperatures...&amp;quot;);&lt;br /&gt;
  unsigned long start = micros(); &lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  float duration = (micros() - start)/1000000.0;&lt;br /&gt;
  Serial.print(&amp;quot;Temperature is: &amp;quot;); &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?  &lt;br /&gt;
  Serial.print(&amp;quot; (took &amp;quot;); &lt;br /&gt;
  Serial.print(duration,3);&lt;br /&gt;
  Serial.println(&amp;quot; seconds)&amp;quot;); &lt;br /&gt;
  // You can have more than one DS18B20 on the same bus.  &lt;br /&gt;
  // 0 refers to the first IC on the wire &lt;br /&gt;
  delay(1000-TempSensor.millisToWaitForConversion(Resolution)); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LET OP'''&lt;br /&gt;
&lt;br /&gt;
Bovenstaand programma gebruikt twee ''libraries'' die met de #include regels worden opgenomen. Dit hebben we eerder gezien bij bijvoorbeeld [[Arduino - Het 1602 LCD Display|Het 1602 LCD project]] waar de LiquidCrystal library werd gebruikt. Het is me gebleken dat de libraries die we hier nodig hebben, OneWire en DallasTemperature, niet altijd beschikbaar zijn. Als die libraries er niet zijn krijg je een foutmelding. In dat geval moeten ze eerst worden geinstalleerd. Dat kan gelukkig toch wel vrij gemakkelijk. Ga daarvoor in de Arduino app naar het '''Tools''' menu en kies dan voor '''Manage libraries...'''. Als je dan zoekt op ''DallasTemperature'' of op ''DS18B20'', dan vind je de juiste library (van Miles Burton en anderen). Klik op de library en klik dan op de '''Install''' knop. Hetzelfde doe je vervolgens voor de ''OneWire'' library (van Jim Studt en anderen). Ook selecteren en installeren. Daarna moet bovenstaand programma werken. Je kunt ook op andere manieren libraries installeren en op die manier libraries gebruiken die niet via het menu zijn te vinden. Als je daar meer over wilt weten kijk dan eens [[https://www.arduino.cc/en/guide/libraries hier]] (in het Engels).&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma communiceert via een seriele verbinding digitaal met de sensor. We kunnen alle details van die communicatie in onze code programmeren, maar in dit soort gevallen is het veel aantrekkelijker om daaroor een library te gebruiken. Hier gebruiken we twee libraries:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let op dat deze statements niet worden afgesloten met een '';''. De ''OneWire'' library bevat de benodigde code van het OneWire communicatie protocol dat de DS18B20 sensor gebruikt. De tweede library maakt het mogelijk om via het OneWire protocol commando's naar de sensor te sturen en informatie uit te lezen. &lt;br /&gt;
Met het statement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define ONE_WIRE_BUS 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wordt de pin vastgelegd die de Arduino gebruikt om via het OneWire protocol met de sensor te ''praten''. De signaaldraad van de sensor moet dus verbonden zijn met pin 2. Overigens kan de Arduino via dezelfde verbinding met meerdere sensoren praten zolang die maar allemaal het OneWire protocol gebruiken. Merk op dat dit een gewone digitale pin is en niet een van de twee pins die de normale seriele communicatie gebruikt (dat zijn pins 0 en 1). &lt;br /&gt;
Daarna worden er twee objecten gemaakt. Het eerste is het OneWire object. Een ''object'' is een software structuur die zich laat aanspreken als ware het de hardware zelf. Objecten hebben allerlei handige functies die horen bij het type object waar het over gaat. Het oneWire object is van het type OneWire (let op de eerste hoofdletter) en heeft functies aan boord die het communiceren gemakkelijker maken. Het TempSensor object is van het type DallasTemperature en heeft functies aan boord om die sensor aan te sturen en uit te lezen. Het is belangrijk om te zien dat dit object een OneWire object nodig heeft. Dit object wordt als parameter doorgegeven aan het TempSensor object via ''&amp;amp;oneWire''. Dat ''&amp;amp;'' teken geeft aan op welke wijze het wordt doorgegeven - het is nu nog te vroeg om daar dieper op in te gaan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De code om deze objecten te maken staat allemaal in de libraries. Daar hebben we geen omkijken naar, al moeten we wel weten welke functies er zijn en hoe die aangeroepen moeten worden. Daarvoor moet je in de documentatie van de libraries zoeken en vaak moet je het een en ander proberen. Je kunt vaak ook voorbeelden vinden die heel illustratief zijn.&lt;br /&gt;
De ''setup()'' functie start een seriele communicatie zodat we de temperatuur kunnen aflezen op de Serial Monitor. De ''setup()'' stelt ook de resolutie in van de sensor. De DS18B20 kan een snelle maar onnauwkeurige meting doen in 9 bits (alleen hele graden), of een nauwkeurigere maar veel langzamere meting in 12 bits (in achsten van een graad). De variabele ''Resolution'' bepaald dit en wij hebben die ingesteld op 10 bits (dit geeft een resolutie van 0,5 graden). Om die resolutie in te stellen hebben we het adres van de sensor nodig. Dat wordt eerst uitgelezen door de functie ''TempSensor.getAddress()'' aan te roepen. Hier wordt het volgnummer van de sensor als parameter opgegeven omdat er meerdere sensoren op de OneWire bus kunnen zitten. Nu hebben we maar een sensor en dus is dat volgnummer 0. De adres variabele moet overigens een lijst met 8 bytes zijn. Vervolgens wordt de resolutie van de sensor op dit adres ingesteld op de gewenste waarde met ''TempSensor.setResolution()''. Voor de zekerheid lezen we de ingestelde resolutie nog een keer uit met ''TempSensor.getResolution(addr)'' en geven die resolutie weer op de Serial Monitor. De setup() functie doet dus veel meer dan nodig, maar voor hier is dat leerzamer. &lt;br /&gt;
In de loop() functie is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
het belangrijkste. De aanroep ''TempSensor.requestTemperatures()'' vraagt om de meting te starten. Die meting kost tijd en het programma wacht tot de sensor klaar is. Intussen kan er dus niets anders worden gedaan. Vervolgens kan de temperatuur worden uitgelezen via ''TempSensor.getTempCByIndex(0)''. De uitgelezen waarde wordt meteen ook weergegeven op de Serial Monitor. De index ''0'' is nodig omdat het TempSensor object meerdere sensoren kan bedienen. In ons geval is dat er maar een, maar je kunt prima 5 temperatuur sensoren aan een OneWire bus hangen. Rond deze kern wordt een tijdmeting gedaan om te zien hoeveel tijd de temperatuurmeting kostte. Als je de resolutie verandert zul je zien dat de benodigde tijd afhangt van de ingestelde resolutie. Tenslotte wordt een gewacht zodat er ongeveer 1 meting per seconde wordt gedaan. De wachttijd is afhankelijk van de vereiste resolutie en wordt gecorrigeerd voor de meettijd via ''TempSensor.millisToWaitForConversion(Resolution)''.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
We hebben al een paar keer gemeld dat het OneWire protocol toelaat om de Arduino via een en dezelfde signaal pin met meerdere sensoren te laten praten. Je kunt dus meerdere temperaturen uitlezen via een pin! Als je beschikt over een extra DS18B20 is het de moeite om dat eens te proberen. Onderstaande schakeling geeft aan hoe de sensoren aangesloten moeten worden op de plus, min en signaal pin. Let op dat er maar een weerstand nodig is van 4k7Ω. Dit is dan ook de reden dat de weerstand niet al zit ingebouwd in de sensor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_multi-schakeling.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|Het aansluiten van meerdere DS18B20 sensoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Kun jij het programma zo aanpassen dat je alle sensoren kunt uitlezen?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - 4-digit LED Segment Display|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Een digitale clock|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=183</id>
		<title>Arduino - Temperatuur meten met een DS18B20 sensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=183"/>
				<updated>2020-12-07T10:09:20Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Het programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperatuur kan op vele manieren worden gemeten, vaak met erg goedkope sensoren. In [[Arduino - Allerlei sensoren|Allerlei sensoren]] hebben we gezien hoe je een NTC kunt gebruiken, maar dat het lastig kan zijn om daarmee nauwkeurige metingen te doen. Met een LM35 gaat het al een stuk gemakkelijker maar wordt lang niet het hele volt-bereik gebruikt waardoor de meting minder precies zal zijn. Ook moet je speciale maatregelen nemen om te meten bij vorst. De Pt100 is een uitstekende sensor die ook industrieel vaak wordt toegepast, maar die voor een goede meting wel extra componenten nodig heeft om een signaal te krijgen dat voor een Arduino goed meetbaar is. In dit project zullen we een digitale sensor gebruiken die heel goed samenwerkt met het Arduino platform.&lt;br /&gt;
&lt;br /&gt;
===De DS18B20===&lt;br /&gt;
De DS18B20 sensor is, zoals de titel al aangeeft, een digitale sensor: je hoeft geen spanning te meten die je moet omrekenen naar een temperatuur, maar je ontvangt de meetwaarde direct in digitale vorm. De DS18B20 heeft daarbij een nauwkeurigheid van 0,5°C en is, als het goed is, in de fabriek al gecalibreerd. Weliswaar is een DS18B20 iets duurder dan een LM35 of een elementaire NTC, maar de prijs blijft toch meestal onder de €3,00. De grootste voordelen zijn dat de sensor niet gecalibreerd hoeft te worden en dat de meetwaarde onafhankelijk is van de exacte voedingsspanning, die mag varieren tussen de 3,0V en 5,5V. Daarbij kan een Arduino uitstekend communiceren met de sensor via een seriele lijn. Een extra pluspunt is dat je meerdere sensoren kunt uitlezen via dezelfde seriele verbinding en je dus meer pins over houdt voor andere dingen. Het meetbereik van de sensor is van -55°C tot 125°C.&lt;br /&gt;
&lt;br /&gt;
De DS18B20 heeft drie aansluitingen: een voor de plus, een voor aarde (de nul), en een derde voor het seriele signaal. De sensor is er in meerdere uitvoeringsvormen. De meest elementaire vorm lijkt erg op een transistor (net als de LM35). Er is ook een DIL-chip en hij wordt veel verkocht in een vorm waarbij de sensor is ondergebracht in een waterdichte behuizing (metalen kokertje) en een kabel met drie aansluitdraden. In die laatste vorm is er meestal een rode draad voor de plus, een zwarte voor de nul, terwijl de signaaldraad meestal geel is. In dit project zullen we de sensor op de normale manier aansluiten waarbij alle drie de aansluitingen worden gebruikt. Er is ook een &amp;quot;parasite mode&amp;quot; waarbij de sensor functioneert met slechts twee aansluitdraden. In dat geval wordt de benodigde voeding ''afgesnoept'' van het seriele signaal.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_uitvoeringsvormen.png|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Diverse uitvoeringsvormen van de DS18B20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS18B20 sensor&lt;br /&gt;
*1 weerstand van 4k7Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS18B20 aansluiten op digitale pin 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
byte Resolution = 10;  // 9, 10, 11, 12&lt;br /&gt;
//  9 bit: max  94 ms - hele graden&lt;br /&gt;
// 10 bit: max 188 ms - halve graden&lt;br /&gt;
// 11 bit: max 375 ms - kwart graden&lt;br /&gt;
// 12 bit: max 750 ms - 1/8ste graden - default&lt;br /&gt;
&lt;br /&gt;
// Data wire is plugged into pin 2 on the Arduino &lt;br /&gt;
#define ONE_WIRE_BUS 2 &lt;br /&gt;
&lt;br /&gt;
// Setup a oneWire instance to communicate with any OneWire devices  &lt;br /&gt;
// (not just Maxim/Dallas temperature ICs) &lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
// Pass our oneWire reference to Dallas Temperature. &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
void setup(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;Dallas Temperature IC Control Library Demo&amp;quot;); &lt;br /&gt;
  byte addr[8];&lt;br /&gt;
  TempSensor.getAddress(addr,0);&lt;br /&gt;
  TempSensor.setResolution(addr,Resolution);  // 9, 10, 11, or 12&lt;br /&gt;
  Serial.print(&amp;quot;Actual resolution = &amp;quot;); &lt;br /&gt;
  Serial.println(TempSensor.getResolution(addr));&lt;br /&gt;
  TempSensor.begin(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.print(&amp;quot; Requesting temperatures...&amp;quot;);&lt;br /&gt;
  unsigned long start = micros(); &lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  float duration = (micros() - start)/1000000.0;&lt;br /&gt;
  Serial.print(&amp;quot;Temperature is: &amp;quot;); &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?  &lt;br /&gt;
  Serial.print(&amp;quot; (took &amp;quot;); &lt;br /&gt;
  Serial.print(duration,3);&lt;br /&gt;
  Serial.println(&amp;quot; seconds)&amp;quot;); &lt;br /&gt;
  // You can have more than one DS18B20 on the same bus.  &lt;br /&gt;
  // 0 refers to the first IC on the wire &lt;br /&gt;
  delay(1000-TempSensor.millisToWaitForConversion(Resolution)); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LET OP'''&lt;br /&gt;
&lt;br /&gt;
Bovenstaand programma gebruikt twee ''libraries'' die met de #include regels worden opgenomen. Dit hebben we eerder gezien bij bijvoorbeeld [[Arduino - Het 1602 LCD Display|Het 1602 LCD project]] waar de LiquidCrystal library werd gebruikt. Het is me gebleken dat de libraries die we hier nodig hebben, OneWire en DallasTemperature, niet altijd beschikbaar zijn. Als die libraries er niet zijn krijg je een foutmelding. In dat geval moeten ze eerst worden geinstalleerd. Dat kan gelukkig toch wel vrij gemakkelijk. Ga daarvoor in de Arduino app naar het '''Tools''' menu en kies dan voor '''Manage libraries...'''. Als je dan zoekt op ''DallasTemperature'' of op ''DS18B20'', dan vind je de juiste library (van Miles Burton en anderen). Klik op de library en klik dan op de '''Install''' knop. Hetzelfde doe je vervolgens voor de ''OneWire'' library (van Jim Studt en anderen). Ook selecteren en installeren. Daarna moet bovenstaand programma werken. Je kunt ook op andere manieren libraries installeren en op die manier libraries gebruiken die niet via het menu zijn te vinden. Als je daar meer over wilt weten kijk dan eens [[https://www.arduino.cc/en/guide/libraries hier]] (in het Engels).&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma communiceert via een seriele verbinding digitaal met de sensor. We kunnen alle details van die communicatie in onze code programmeren, maar in dit soort gevallen is het veel aantrekkelijker om daaroor een library te gebruiken. Hier gebruiken we twee libraries:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let op dat deze statements niet worden afgesloten met een '';''. De ''OneWire'' library bevat de benodigde code van het OneWire communicatie protocol dat de DS18B20 sensor gebruikt. De tweede library maakt het mogelijk om via het OneWire protocol commando's naar de sensor te sturen en informatie uit te lezen. &lt;br /&gt;
Met het statement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define ONE_WIRE_BUS 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wordt de pin vastgelegd die de Arduino gebruikt om via het OneWire protocol met de sensor te ''praten''. De signaaldraad van de sensor moet dus verbonden zijn met pin 2. Overigens kan de Arduino via dezelfde verbinding met meerdere sensoren praten zolang die maar allemaal het OneWire protocol gebruiken. Merk op dat dit een gewone digitale pin is en niet een van de twee pins die de normale seriele communicatie gebruikt (dat zijn pins 0 en 1). &lt;br /&gt;
Daarna worden er twee objecten gemaakt. Het eerste is het OneWire object. Een ''object'' is een software structuur die zich laat aanspreken als ware het de hardware zelf. Objecten hebben allerlei handige functies die horen bij het type object waar het over gaat. Het oneWire object is van het type OneWire (let op de eerste hoofdletter) en heeft functies aan boor die het communiceren gemakkelijker maken. Het TempSensor object is van het type DallasTemperature en heeft functies aan boord om die sensor aan te sturen en uit te lezen. Het is belangrijk om te zien dat dit object een OneWire object nodig heeft. Dit object wordt als parameter doorgegeven aan het TempSensor object via ''&amp;amp;oneWire''. Dat ''&amp;amp;'' teken geeft aan op welke wijze het wordt doorgegeven - het is nu nog te vroeg om daar dieper op in te gaan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De code om deze objecten te maken staat allemaal in de libraries. Daar hebben we geen omkijken naar, al moeten we wel weten welke functies er zijn en hoe die aangeroepen moeten worden. Daarvoor moet je in de documentatie van de libraries zoeken en vaak moet je het een en ander proberen. Je kunt vaak ook voorbeelden vinden die heel illustratief zijn.&lt;br /&gt;
De ''setup()'' functie start een seriele communicatie zodat we de temperatuur kunnen aflezen op de Serial Monitor. De ''setup()'' stelt ook de resolutie in van de sensor. De DS18B20 kan een snelle maar onnauwkeurige meting doen in 9 bits (alleen hele graden), of een nauwkeurigere maar veel langzamere meting in 12 bits (in achsten van een graad). De variabele ''Resolution'' bepaald dit en wij hebben die ingesteld op 10 bits (dit geeft een resolutie van 0,5 graden). Om die resolutie in te stellen hebben we het adres van de sensor nodig. Dat wordt eerst uitgelezen door de functie ''TempSensor.getAddress()'' aan te roepen. Hier wordt het volgnummer van de sensor als parameter opgegeven omdat er meerdere sensoren op de OneWire bus kunnen zitten. Nu hebben we maar een sensor en dus is dat volgnummer 0. De adres variabele moet overigens een lijst met 8 bytes zijn. Vervolgens wordt de resolutie van de sensor op dit adres ingesteld op de gewenste waarde met ''TempSensor.setResolution()''. Voor de zekerheid lezen we de ingestelde resolutie nog een keer uit met ''TempSensor.getResolution(addr)'' en geven die resolutie weer op de Serial Monitor. De setup() functie doet dus veel meer dan nodig, maar voor hier is dat leerzamer. &lt;br /&gt;
In de loop() functie is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
het belangrijkste. De aanroep ''TempSensor.requestTemperatures()'' vraagt om de meting te starten. Die meting kost tijd en het programma wacht tot de sensor klaar is. Intussen kan er dus niets anders worden gedaan. Vervolgens kan de temperatuur worden uitgelezen via ''TempSensor.getTempCByIndex(0)''. De uitgelezen waarde wordt meteen ook weergegeven op de Serial Monitor. De index ''0'' is nodig omdat het TempSensor object meerdere sensoren kan bedienen. In ons geval is dat er maar een, maar je kunt prima 5 temperatuur sensoren aan een OneWire bus hangen. Rond deze kern wordt een tijdmeting gedaan om te zien hoeveel tijd de temperatuurmeting kostte. Als je de resolutie verandert zul je zien dat de benodigde tijd afhangt van de ingestelde resolutie. Tenslotte wordt een gewacht zodat er ongeveer 1 meting per seconde wordt gedaan. De wachttijd is afhankelijk van de vereiste resolutie en wordt gecorrigeerd voor de meettijd via ''TempSensor.millisToWaitForConversion(Resolution)''.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
We hebben al een paar keer gemeld dat het OneWire protocol toelaat om de Arduino via een en dezelfde signaal pin met meerdere sensoren te laten praten. Je kunt dus meerdere temperaturen uitlezen via een pin! Als je beschikt over een extra DS18B20 is het de moeite om dat eens te proberen. Onderstaande schakeling geeft aan hoe de sensoren aangesloten moeten worden op de plus, min en signaal pin. Let op dat er maar een weerstand nodig is van 4k7Ω. Dit is dan ook de reden dat de weerstand niet al zit ingebouwd in de sensor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_multi-schakeling.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|Het aansluiten van meerdere DS18B20 sensoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Kun jij het programma zo aanpassen dat je alle sensoren kunt uitlezen?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - 4-digit LED Segment Display|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Een digitale clock|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=182</id>
		<title>Arduino - Temperatuur meten met een DS18B20 sensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=182"/>
				<updated>2020-12-07T10:08:13Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Het programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperatuur kan op vele manieren worden gemeten, vaak met erg goedkope sensoren. In [[Arduino - Allerlei sensoren|Allerlei sensoren]] hebben we gezien hoe je een NTC kunt gebruiken, maar dat het lastig kan zijn om daarmee nauwkeurige metingen te doen. Met een LM35 gaat het al een stuk gemakkelijker maar wordt lang niet het hele volt-bereik gebruikt waardoor de meting minder precies zal zijn. Ook moet je speciale maatregelen nemen om te meten bij vorst. De Pt100 is een uitstekende sensor die ook industrieel vaak wordt toegepast, maar die voor een goede meting wel extra componenten nodig heeft om een signaal te krijgen dat voor een Arduino goed meetbaar is. In dit project zullen we een digitale sensor gebruiken die heel goed samenwerkt met het Arduino platform.&lt;br /&gt;
&lt;br /&gt;
===De DS18B20===&lt;br /&gt;
De DS18B20 sensor is, zoals de titel al aangeeft, een digitale sensor: je hoeft geen spanning te meten die je moet omrekenen naar een temperatuur, maar je ontvangt de meetwaarde direct in digitale vorm. De DS18B20 heeft daarbij een nauwkeurigheid van 0,5°C en is, als het goed is, in de fabriek al gecalibreerd. Weliswaar is een DS18B20 iets duurder dan een LM35 of een elementaire NTC, maar de prijs blijft toch meestal onder de €3,00. De grootste voordelen zijn dat de sensor niet gecalibreerd hoeft te worden en dat de meetwaarde onafhankelijk is van de exacte voedingsspanning, die mag varieren tussen de 3,0V en 5,5V. Daarbij kan een Arduino uitstekend communiceren met de sensor via een seriele lijn. Een extra pluspunt is dat je meerdere sensoren kunt uitlezen via dezelfde seriele verbinding en je dus meer pins over houdt voor andere dingen. Het meetbereik van de sensor is van -55°C tot 125°C.&lt;br /&gt;
&lt;br /&gt;
De DS18B20 heeft drie aansluitingen: een voor de plus, een voor aarde (de nul), en een derde voor het seriele signaal. De sensor is er in meerdere uitvoeringsvormen. De meest elementaire vorm lijkt erg op een transistor (net als de LM35). Er is ook een DIL-chip en hij wordt veel verkocht in een vorm waarbij de sensor is ondergebracht in een waterdichte behuizing (metalen kokertje) en een kabel met drie aansluitdraden. In die laatste vorm is er meestal een rode draad voor de plus, een zwarte voor de nul, terwijl de signaaldraad meestal geel is. In dit project zullen we de sensor op de normale manier aansluiten waarbij alle drie de aansluitingen worden gebruikt. Er is ook een &amp;quot;parasite mode&amp;quot; waarbij de sensor functioneert met slechts twee aansluitdraden. In dat geval wordt de benodigde voeding ''afgesnoept'' van het seriele signaal.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_uitvoeringsvormen.png|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Diverse uitvoeringsvormen van de DS18B20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS18B20 sensor&lt;br /&gt;
*1 weerstand van 4k7Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS18B20 aansluiten op digitale pin 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
byte Resolution = 10;  // 9, 10, 11, 12&lt;br /&gt;
//  9 bit: max  94 ms - hele graden&lt;br /&gt;
// 10 bit: max 188 ms - halve graden&lt;br /&gt;
// 11 bit: max 375 ms - kwart graden&lt;br /&gt;
// 12 bit: max 750 ms - 1/8ste graden - default&lt;br /&gt;
&lt;br /&gt;
// Data wire is plugged into pin 2 on the Arduino &lt;br /&gt;
#define ONE_WIRE_BUS 2 &lt;br /&gt;
&lt;br /&gt;
// Setup a oneWire instance to communicate with any OneWire devices  &lt;br /&gt;
// (not just Maxim/Dallas temperature ICs) &lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
// Pass our oneWire reference to Dallas Temperature. &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
void setup(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;Dallas Temperature IC Control Library Demo&amp;quot;); &lt;br /&gt;
  byte addr[8];&lt;br /&gt;
  TempSensor.getAddress(addr,0);&lt;br /&gt;
  TempSensor.setResolution(addr,Resolution);  // 9, 10, 11, or 12&lt;br /&gt;
  Serial.print(&amp;quot;Actual resolution = &amp;quot;); &lt;br /&gt;
  Serial.println(TempSensor.getResolution(addr));&lt;br /&gt;
  TempSensor.begin(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.print(&amp;quot; Requesting temperatures...&amp;quot;);&lt;br /&gt;
  unsigned long start = micros(); &lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  float duration = (micros() - start)/1000000.0;&lt;br /&gt;
  Serial.print(&amp;quot;Temperature is: &amp;quot;); &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?  &lt;br /&gt;
  Serial.print(&amp;quot; (took &amp;quot;); &lt;br /&gt;
  Serial.print(duration,3);&lt;br /&gt;
  Serial.println(&amp;quot; seconds)&amp;quot;); &lt;br /&gt;
  // You can have more than one DS18B20 on the same bus.  &lt;br /&gt;
  // 0 refers to the first IC on the wire &lt;br /&gt;
  delay(1000-TempSensor.millisToWaitForConversion(Resolution)); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LET OP'''&lt;br /&gt;
&lt;br /&gt;
Bovenstaand programma gebruikt twee ''libraries'' die met de #include regels worden opgenomen. Dit hebben we eerder gezien bij bijvoorbeeld [[Arduino - Het 1602 LCD Display|Het 1602 LCD project]] waar de LiquidCrystal library werd gebruikt. Het is me gebleken dat de libraries die we hier nodig hebben, OneWire en DallasTemperature, niet altijd beschikbaar zijn. Als die libraries er niet zijn krijg je een foutmelding. In dat geval moeten ze eerst worden geinstalleerd. Dat kan gelukkig toch wel vrij gemakkelijk. Ga daarvoor in de Arduino app naar het '''Tools''' menu en kies dan voor '''Manage libraries...'''. Als je dan zoekt op ''DallasTemperature'' of op ''DS18B20'', dan vind je de juiste library (van Miles Burton en anderen). Klik op de library en klik dan op de '''Install''' knop. Hetzelfde doe je vervolgens voor de ''OneWire'' library (van Jim Studt en anderen). Ook selecteren en installeren. Daarna moet bovenstaand programma werken. Je kunt ook op andere manieren libraries installeren en op die manier libraries gebruiken die niet via het menu zijn te vinden. Als je daar meer over wilt weten kijk dan eens [[https://www.arduino.cc/en/guide/libraries|hier]] (in het Engels).&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma communiceert via een seriele verbinding digitaal met de sensor. We kunnen alle details van die communicatie in onze code programmeren, maar in dit soort gevallen is het veel aantrekkelijker om daaroor een library te gebruiken. Hier gebruiken we twee libraries:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let op dat deze statements niet worden afgesloten met een '';''. De ''OneWire'' library bevat de benodigde code van het OneWire communicatie protocol dat de DS18B20 sensor gebruikt. De tweede library maakt het mogelijk om via het OneWire protocol commando's naar de sensor te sturen en informatie uit te lezen. &lt;br /&gt;
Met het statement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define ONE_WIRE_BUS 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wordt de pin vastgelegd die de Arduino gebruikt om via het OneWire protocol met de sensor te ''praten''. De signaaldraad van de sensor moet dus verbonden zijn met pin 2. Overigens kan de Arduino via dezelfde verbinding met meerdere sensoren praten zolang die maar allemaal het OneWire protocol gebruiken. Merk op dat dit een gewone digitale pin is en niet een van de twee pins die de normale seriele communicatie gebruikt (dat zijn pins 0 en 1). &lt;br /&gt;
Daarna worden er twee objecten gemaakt. Het eerste is het OneWire object. Een ''object'' is een software structuur die zich laat aanspreken als ware het de hardware zelf. Objecten hebben allerlei handige functies die horen bij het type object waar het over gaat. Het oneWire object is van het type OneWire (let op de eerste hoofdletter) en heeft functies aan boor die het communiceren gemakkelijker maken. Het TempSensor object is van het type DallasTemperature en heeft functies aan boord om die sensor aan te sturen en uit te lezen. Het is belangrijk om te zien dat dit object een OneWire object nodig heeft. Dit object wordt als parameter doorgegeven aan het TempSensor object via ''&amp;amp;oneWire''. Dat ''&amp;amp;'' teken geeft aan op welke wijze het wordt doorgegeven - het is nu nog te vroeg om daar dieper op in te gaan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De code om deze objecten te maken staat allemaal in de libraries. Daar hebben we geen omkijken naar, al moeten we wel weten welke functies er zijn en hoe die aangeroepen moeten worden. Daarvoor moet je in de documentatie van de libraries zoeken en vaak moet je het een en ander proberen. Je kunt vaak ook voorbeelden vinden die heel illustratief zijn.&lt;br /&gt;
De ''setup()'' functie start een seriele communicatie zodat we de temperatuur kunnen aflezen op de Serial Monitor. De ''setup()'' stelt ook de resolutie in van de sensor. De DS18B20 kan een snelle maar onnauwkeurige meting doen in 9 bits (alleen hele graden), of een nauwkeurigere maar veel langzamere meting in 12 bits (in achsten van een graad). De variabele ''Resolution'' bepaald dit en wij hebben die ingesteld op 10 bits (dit geeft een resolutie van 0,5 graden). Om die resolutie in te stellen hebben we het adres van de sensor nodig. Dat wordt eerst uitgelezen door de functie ''TempSensor.getAddress()'' aan te roepen. Hier wordt het volgnummer van de sensor als parameter opgegeven omdat er meerdere sensoren op de OneWire bus kunnen zitten. Nu hebben we maar een sensor en dus is dat volgnummer 0. De adres variabele moet overigens een lijst met 8 bytes zijn. Vervolgens wordt de resolutie van de sensor op dit adres ingesteld op de gewenste waarde met ''TempSensor.setResolution()''. Voor de zekerheid lezen we de ingestelde resolutie nog een keer uit met ''TempSensor.getResolution(addr)'' en geven die resolutie weer op de Serial Monitor. De setup() functie doet dus veel meer dan nodig, maar voor hier is dat leerzamer. &lt;br /&gt;
In de loop() functie is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
het belangrijkste. De aanroep ''TempSensor.requestTemperatures()'' vraagt om de meting te starten. Die meting kost tijd en het programma wacht tot de sensor klaar is. Intussen kan er dus niets anders worden gedaan. Vervolgens kan de temperatuur worden uitgelezen via ''TempSensor.getTempCByIndex(0)''. De uitgelezen waarde wordt meteen ook weergegeven op de Serial Monitor. De index ''0'' is nodig omdat het TempSensor object meerdere sensoren kan bedienen. In ons geval is dat er maar een, maar je kunt prima 5 temperatuur sensoren aan een OneWire bus hangen. Rond deze kern wordt een tijdmeting gedaan om te zien hoeveel tijd de temperatuurmeting kostte. Als je de resolutie verandert zul je zien dat de benodigde tijd afhangt van de ingestelde resolutie. Tenslotte wordt een gewacht zodat er ongeveer 1 meting per seconde wordt gedaan. De wachttijd is afhankelijk van de vereiste resolutie en wordt gecorrigeerd voor de meettijd via ''TempSensor.millisToWaitForConversion(Resolution)''.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
We hebben al een paar keer gemeld dat het OneWire protocol toelaat om de Arduino via een en dezelfde signaal pin met meerdere sensoren te laten praten. Je kunt dus meerdere temperaturen uitlezen via een pin! Als je beschikt over een extra DS18B20 is het de moeite om dat eens te proberen. Onderstaande schakeling geeft aan hoe de sensoren aangesloten moeten worden op de plus, min en signaal pin. Let op dat er maar een weerstand nodig is van 4k7Ω. Dit is dan ook de reden dat de weerstand niet al zit ingebouwd in de sensor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_multi-schakeling.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|Het aansluiten van meerdere DS18B20 sensoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Kun jij het programma zo aanpassen dat je alle sensoren kunt uitlezen?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - 4-digit LED Segment Display|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Een digitale clock|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=181</id>
		<title>Arduino - Temperatuur meten met een DS18B20 sensor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Temperatuur_meten_met_een_DS18B20_sensor&amp;diff=181"/>
				<updated>2020-12-05T14:12:05Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Temperatuur kan op vele manieren worden gemeten, vaak met erg goedkope sensoren. In [[Arduino - Allerlei sensoren|Allerlei sensoren]] hebben we gezien hoe je een NTC kunt gebruiken, maar dat het lastig kan zijn om daarmee nauwkeurige metingen te doen. Met een LM35 gaat het al een stuk gemakkelijker maar wordt lang niet het hele volt-bereik gebruikt waardoor de meting minder precies zal zijn. Ook moet je speciale maatregelen nemen om te meten bij vorst. De Pt100 is een uitstekende sensor die ook industrieel vaak wordt toegepast, maar die voor een goede meting wel extra componenten nodig heeft om een signaal te krijgen dat voor een Arduino goed meetbaar is. In dit project zullen we een digitale sensor gebruiken die heel goed samenwerkt met het Arduino platform.&lt;br /&gt;
&lt;br /&gt;
===De DS18B20===&lt;br /&gt;
De DS18B20 sensor is, zoals de titel al aangeeft, een digitale sensor: je hoeft geen spanning te meten die je moet omrekenen naar een temperatuur, maar je ontvangt de meetwaarde direct in digitale vorm. De DS18B20 heeft daarbij een nauwkeurigheid van 0,5°C en is, als het goed is, in de fabriek al gecalibreerd. Weliswaar is een DS18B20 iets duurder dan een LM35 of een elementaire NTC, maar de prijs blijft toch meestal onder de €3,00. De grootste voordelen zijn dat de sensor niet gecalibreerd hoeft te worden en dat de meetwaarde onafhankelijk is van de exacte voedingsspanning, die mag varieren tussen de 3,0V en 5,5V. Daarbij kan een Arduino uitstekend communiceren met de sensor via een seriele lijn. Een extra pluspunt is dat je meerdere sensoren kunt uitlezen via dezelfde seriele verbinding en je dus meer pins over houdt voor andere dingen. Het meetbereik van de sensor is van -55°C tot 125°C.&lt;br /&gt;
&lt;br /&gt;
De DS18B20 heeft drie aansluitingen: een voor de plus, een voor aarde (de nul), en een derde voor het seriele signaal. De sensor is er in meerdere uitvoeringsvormen. De meest elementaire vorm lijkt erg op een transistor (net als de LM35). Er is ook een DIL-chip en hij wordt veel verkocht in een vorm waarbij de sensor is ondergebracht in een waterdichte behuizing (metalen kokertje) en een kabel met drie aansluitdraden. In die laatste vorm is er meestal een rode draad voor de plus, een zwarte voor de nul, terwijl de signaaldraad meestal geel is. In dit project zullen we de sensor op de normale manier aansluiten waarbij alle drie de aansluitingen worden gebruikt. Er is ook een &amp;quot;parasite mode&amp;quot; waarbij de sensor functioneert met slechts twee aansluitdraden. In dat geval wordt de benodigde voeding ''afgesnoept'' van het seriele signaal.  &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_uitvoeringsvormen.png|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|Diverse uitvoeringsvormen van de DS18B20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 DS18B20 sensor&lt;br /&gt;
*1 weerstand van 4k7Ω&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Een DS18B20 aansluiten op digitale pin 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
byte Resolution = 10;  // 9, 10, 11, 12&lt;br /&gt;
//  9 bit: max  94 ms - hele graden&lt;br /&gt;
// 10 bit: max 188 ms - halve graden&lt;br /&gt;
// 11 bit: max 375 ms - kwart graden&lt;br /&gt;
// 12 bit: max 750 ms - 1/8ste graden - default&lt;br /&gt;
&lt;br /&gt;
// Data wire is plugged into pin 2 on the Arduino &lt;br /&gt;
#define ONE_WIRE_BUS 2 &lt;br /&gt;
&lt;br /&gt;
// Setup a oneWire instance to communicate with any OneWire devices  &lt;br /&gt;
// (not just Maxim/Dallas temperature ICs) &lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
// Pass our oneWire reference to Dallas Temperature. &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&lt;br /&gt;
void setup(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.begin(9600); &lt;br /&gt;
  Serial.println(&amp;quot;Dallas Temperature IC Control Library Demo&amp;quot;); &lt;br /&gt;
  byte addr[8];&lt;br /&gt;
  TempSensor.getAddress(addr,0);&lt;br /&gt;
  TempSensor.setResolution(addr,Resolution);  // 9, 10, 11, or 12&lt;br /&gt;
  Serial.print(&amp;quot;Actual resolution = &amp;quot;); &lt;br /&gt;
  Serial.println(TempSensor.getResolution(addr));&lt;br /&gt;
  TempSensor.begin(); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) &lt;br /&gt;
{ &lt;br /&gt;
  Serial.print(&amp;quot; Requesting temperatures...&amp;quot;);&lt;br /&gt;
  unsigned long start = micros(); &lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  float duration = (micros() - start)/1000000.0;&lt;br /&gt;
  Serial.print(&amp;quot;Temperature is: &amp;quot;); &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?  &lt;br /&gt;
  Serial.print(&amp;quot; (took &amp;quot;); &lt;br /&gt;
  Serial.print(duration,3);&lt;br /&gt;
  Serial.println(&amp;quot; seconds)&amp;quot;); &lt;br /&gt;
  // You can have more than one DS18B20 on the same bus.  &lt;br /&gt;
  // 0 refers to the first IC on the wire &lt;br /&gt;
  delay(1000-TempSensor.millisToWaitForConversion(Resolution)); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma communiceert via een seriele verbinding digitaal met de sensor. We kunnen alle details van die communicatie in onze code programmeren, maar in dit soort gevallen is het veel aantrekkelijker om daaroor een library te gebruiken. Hier gebruiken we twee libraries:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;DallasTemperature.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Let op dat deze statements niet worden afgesloten met een '';''. De ''OneWire'' library bevat de benodigde code van het OneWire communicatie protocol dat de DS18B20 sensor gebruikt. De tweede library maakt het mogelijk om via het OneWire protocol commando's naar de sensor te sturen en informatie uit te lezen. &lt;br /&gt;
Met het statement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define ONE_WIRE_BUS 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
wordt de pin vastgelegd die de Arduino gebruikt om via het OneWire protocol met de sensor te ''praten''. De signaaldraad van de sensor moet dus verbonden zijn met pin 2. Overigens kan de Arduino via dezelfde verbinding met meerdere sensoren praten zolang die maar allemaal het OneWire protocol gebruiken. Merk op dat dit een gewone digitale pin is en niet een van de twee pins die de normale seriele communicatie gebruikt (dat zijn pins 0 en 1). &lt;br /&gt;
Daarna worden er twee objecten gemaakt. Het eerste is het OneWire object. Een ''object'' is een software structuur die zich laat aanspreken als ware het de hardware zelf. Objecten hebben allerlei handige functies die horen bij het type object waar het over gaat. Het oneWire object is van het type OneWire (let op de eerste hoofdletter) en heeft functies aan boor die het communiceren gemakkelijker maken. Het TempSensor object is van het type DallasTemperature en heeft functies aan boord om die sensor aan te sturen en uit te lezen. Het is belangrijk om te zien dat dit object een OneWire object nodig heeft. Dit object wordt als parameter doorgegeven aan het TempSensor object via ''&amp;amp;oneWire''. Dat ''&amp;amp;'' teken geeft aan op welke wijze het wordt doorgegeven - het is nu nog te vroeg om daar dieper op in te gaan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OneWire oneWire(ONE_WIRE_BUS); &lt;br /&gt;
DallasTemperature TempSensor(&amp;amp;oneWire);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De code om deze objecten te maken staat allemaal in de libraries. Daar hebben we geen omkijken naar, al moeten we wel weten welke functies er zijn en hoe die aangeroepen moeten worden. Daarvoor moet je in de documentatie van de libraries zoeken en vaak moet je het een en ander proberen. Je kunt vaak ook voorbeelden vinden die heel illustratief zijn.&lt;br /&gt;
De ''setup()'' functie start een seriele communicatie zodat we de temperatuur kunnen aflezen op de Serial Monitor. De ''setup()'' stelt ook de resolutie in van de sensor. De DS18B20 kan een snelle maar onnauwkeurige meting doen in 9 bits (alleen hele graden), of een nauwkeurigere maar veel langzamere meting in 12 bits (in achsten van een graad). De variabele ''Resolution'' bepaald dit en wij hebben die ingesteld op 10 bits (dit geeft een resolutie van 0,5 graden). Om die resolutie in te stellen hebben we het adres van de sensor nodig. Dat wordt eerst uitgelezen door de functie ''TempSensor.getAddress()'' aan te roepen. Hier wordt het volgnummer van de sensor als parameter opgegeven omdat er meerdere sensoren op de OneWire bus kunnen zitten. Nu hebben we maar een sensor en dus is dat volgnummer 0. De adres variabele moet overigens een lijst met 8 bytes zijn. Vervolgens wordt de resolutie van de sensor op dit adres ingesteld op de gewenste waarde met ''TempSensor.setResolution()''. Voor de zekerheid lezen we de ingestelde resolutie nog een keer uit met ''TempSensor.getResolution(addr)'' en geven die resolutie weer op de Serial Monitor. De setup() functie doet dus veel meer dan nodig, maar voor hier is dat leerzamer. &lt;br /&gt;
In de loop() functie is&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  TempSensor.requestTemperatures(); // Send the command to get temperature readings &lt;br /&gt;
  Serial.print(TempSensor.getTempCByIndex(0)); // Why &amp;quot;byIndex&amp;quot;?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
het belangrijkste. De aanroep ''TempSensor.requestTemperatures()'' vraagt om de meting te starten. Die meting kost tijd en het programma wacht tot de sensor klaar is. Intussen kan er dus niets anders worden gedaan. Vervolgens kan de temperatuur worden uitgelezen via ''TempSensor.getTempCByIndex(0)''. De uitgelezen waarde wordt meteen ook weergegeven op de Serial Monitor. De index ''0'' is nodig omdat het TempSensor object meerdere sensoren kan bedienen. In ons geval is dat er maar een, maar je kunt prima 5 temperatuur sensoren aan een OneWire bus hangen. Rond deze kern wordt een tijdmeting gedaan om te zien hoeveel tijd de temperatuurmeting kostte. Als je de resolutie verandert zul je zien dat de benodigde tijd afhangt van de ingestelde resolutie. Tenslotte wordt een gewacht zodat er ongeveer 1 meting per seconde wordt gedaan. De wachttijd is afhankelijk van de vereiste resolutie en wordt gecorrigeerd voor de meettijd via ''TempSensor.millisToWaitForConversion(Resolution)''.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
We hebben al een paar keer gemeld dat het OneWire protocol toelaat om de Arduino via een en dezelfde signaal pin met meerdere sensoren te laten praten. Je kunt dus meerdere temperaturen uitlezen via een pin! Als je beschikt over een extra DS18B20 is het de moeite om dat eens te proberen. Onderstaande schakeling geeft aan hoe de sensoren aangesloten moeten worden op de plus, min en signaal pin. Let op dat er maar een weerstand nodig is van 4k7Ω. Dit is dan ook de reden dat de weerstand niet al zit ingebouwd in de sensor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:DS18B20_multi-schakeling.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|Het aansluiten van meerdere DS18B20 sensoren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Kun jij het programma zo aanpassen dat je alle sensoren kunt uitlezen?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - 4-digit LED Segment Display|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Een digitale clock|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Het_1602_LCD_Display&amp;diff=180</id>
		<title>Arduino - Het 1602 LCD Display</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Het_1602_LCD_Display&amp;diff=180"/>
				<updated>2020-12-05T13:55:46Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
===De schakeling===&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 1602 LCD display&lt;br /&gt;
*1 weerstand van 4.7k&lt;br /&gt;
&lt;br /&gt;
Onderstaande schakeling bevat vrij veel verbindingen en het is belangrijk dat elk draadje goed zit. Controleer de schakeling dus goed als er iets mis lijkt te gaan. De weerstand zorgt voor het juiste contrast in het display. Vaak wordt hier een 10k potmeter/instelweerstand gebruikt; als je dat zou doen zou je het contrast kunnen instellen.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:LCD_1602 v3.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Verbindingen in het breadboard voor het LCD scherm&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Het hier gebruikte display heeft 16x2 = 32 posities en op elke positie kan een groot aantal verschillende karakters worden getoond. Hoewel er al best veel draadjes nodig zijn om het display aan te sluiten, snap je vast dat al die karakters nooit in via die draadjes in een keer kunnen worden doorgegeven. Dat gaat dus deels serieel, waarbij zo'n display dus zelf over geheugen moet beschikken en de mogelijkheid moet hebben om seriele invoerdata te verwerken. In feite worden de karakters dus om beurten naar de display verstuurd. Deze schakeling gebruikt bovendien niet alle pins van de LCD. Als je goed kijkt, dan zie je dat aansluitingen D0 tm D3 niet worden gebruikt! Dit is een optie van dit type displays, waarbij elke byte (elke letter) in twee delen (twee ''nibbles'') naar de display wordt verstuurd. Dit gaat iets langzamer dan het alternatief waarbij alle 8 draadjes (D0 tm D7) worden gebruikt, maar heeft het voordeel dat er minder verbindingen nodig zijn. Uiteraard moet in het programma worden opgegeven of er van de 4-bit modus of van de 8-bit modus gebruik wordt gemaakt. Voor meer informatie kun je eens [https://lastminuteengineers.com/arduino-1602-character-lcd-tutorial/ hier] kijken. Daar staat bijvoorbeeld ook beschreven hoe je in plaats van de standaard karakters ook eigen &amp;quot;karakters&amp;quot; kunt maken.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Dit programma is ontleend aan: Bestanden | Voorbeelden | LiquidCrystal | HelloWorld&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;  // dit is een standaard bibliotheek&lt;br /&gt;
&lt;br /&gt;
// maak het lcd object en geef aan welke hoe verbindingen lopen&lt;br /&gt;
// parameters: (rs, enable, d4, d5, d6, d7)&lt;br /&gt;
LiquidCrystal lcd(3, 2, 9, 10, 11, 12);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // geef aan wat de maat is van de LCD (hier 16 karakters op twee regels)&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // plaats een boodschap&lt;br /&gt;
  lcd.print(&amp;quot;Hoera het werkt!&amp;quot;);  // 16 karakters - meer plek is er niet&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // plaats de cursor op de eerste positie van de tweede regel&lt;br /&gt;
  // dat is positie (0,1) omdat men met 0 begint te tellen&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print de tijd sinds de start:&lt;br /&gt;
  lcd.print(0.001 * millis());&lt;br /&gt;
  lcd.print(&amp;quot; sec. bezig&amp;quot;); // na 100 seconden valt de laatste letter weg&lt;br /&gt;
  delay(300+random(1000));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg van het programma===&lt;br /&gt;
In tegenstelling tot de schakeling met al zijn verbindingen is het programma vrij kort en eenvoudig. Dit komt door het gebruik van een '''library'''. Het gaat hier om regel 2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Door deze regel wordt een ingewikkelder stuk software meegenomen en kunnen we ons deel van het programma eenvoudig houden. LET OP: zo'n #include regel wordt ''niet'' afgesloten met een punt-komma. In regel 6 wordt een variabele aangemaakt van het type '''LiquidCrystal'''. Het gaat hier om een '''object-variabele''' waarmee we allerlei taken kunnen uitvoeren door functies ervan aan te roepen. In de setup() geven we eerst nog aan hoe groot onze LCD is. Dat is 16 karakters op 2 regels. Hieruit blijkt dat de LiquidCrystal library ook voor andere LCD's gebruikt moet kunnen worden en dat is goed om te weten. Daarna zetten we een tekst op de eertse regel. dat gaat dus via de print functie van het lcd object. Ditzelfde doen we in de ''loop()'' functie. Voordat we gaan printen wordt de cursor ingesteld op het eerste karakter van de tweede regel. Elke ''lcd.print()'' opdracht zou anders gewoon verder gaan waar hij gebleven was, waarna de regels gaan &amp;quot;scrollen&amp;quot; (doorrollen). Let op dat de laatste ''lcd.print()'' een vrij lange tekst heeft die na 100 seconden te lang wordt. De laatste letter valt dan van het scherm. Tenslotte wachten we even om de tekst leesbaar te houden. Zonder deze delay veranderen de laatste twee decimalen van de tekst zo snel dat ze onleesbaar zouden zijn. De delay heeft een willekeurige wachttijd (de ''random()'' functie) om het interval wat onvoorspelbaar te maken.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Passive buzzer|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Analog Value Reading|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:LCD_1602_v3.png&amp;diff=179</id>
		<title>File:LCD 1602 v3.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:LCD_1602_v3.png&amp;diff=179"/>
				<updated>2020-12-05T13:49:41Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: verbeterde en gecontroleerde versie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;verbeterde en gecontroleerde versie&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:LCD_1602_v2.png&amp;diff=178</id>
		<title>File:LCD 1602 v2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:LCD_1602_v2.png&amp;diff=178"/>
				<updated>2020-12-05T12:04:37Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Rotary_Encoder&amp;diff=177</id>
		<title>Arduino - Rotary Encoder</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Rotary_Encoder&amp;diff=177"/>
				<updated>2018-02-25T13:50:23Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Rotary Encoder lijkt erg op een potmeter die we al vaak hebben gebruikt. Potmeters hebben een weerstand met een variabel aftappunt. Vaak gebruiken we de potmeter om een regelbare spanning te krijgen. Daarvoor hangen we de ene kant van de weerstand aan de plus en de andere kant aan de nul, zodat je op het aftappunt een variabel in te stellen spanning krijgt. De spanning is dan maatgevend voor de stand van de potmeter. Die spanning moet vervolgens wel digitaal worden uitgelezen, waarvoor we dan analoge ingang van de Arduino gebruiken. Daar ontstaat al een probleempje omdat door meetfouten en andere fluctuaties de gemeten spanning steeds een beetje anders is. Zelfs als je helemaal niet aan de potmeter zit. Een eventuele regelaar zal dus continu bij willen regelen, terwijl er eigenlijk niks gebeurt. Bij het [[Arduino - Een servo|servo-project]] hebben we het hier al een keer over gehad. Een ander probleem met normale potmeters kan ontstaan doordat ze hooguit 300 graden kunnen draaien. Soms geeft dat niet genoeg precisie. In dat geval kun je een dure ''meerslags potmeter'' kopen, maar ook dan ben je gelimiteerd. &lt;br /&gt;
&lt;br /&gt;
===Rotary Encoder===&lt;br /&gt;
Een Rotary Encoder is een alternatief invoer apparaatje dat in dit soort gevallen uitkomst kan bieden. Uiterlijk lijken ze erg op een potmeter, maar ze werken heel anders. Dat blijkt ook uit het feit dat ze minimaal 4 aansluitpins hebben, terwijl potmeters er meestal drie hebben. In plaats van een spanning, geven Rotary Encoders pulsen af, één puls per stukje draaing. Dergelijke pulsjes kun je met een Arduino tellen. Daar komt bij dat, door een truukje ook de draai-richting kan worden bepaald zodat je kunt optellen en aftrekken. Er is in feite geen limiet voor wat betreft de precisie, maar als je heel grote precisie wilt, moet je natuurlijk wel veel draaien, al kun je daar softwarematig nog wel wat aan doen. Je slaat dan bijvoorbeeld stukken over als de pulsjes snel achter elkaar komen. Op die manier kun je lekker snel naar een bepaald punt toe, zonder in te leveren op precisie. Overigens is het aantal pulsjes per hele ronde afhankelijk van het type Rotary Encoder, waarbij meer pulsjes per ronde natuurlijk is voorbehouden voor de duurdere types. Een standaard Rotary Encoder heeft bijvoorbeeld 18 of 30 graden per tic, dus 20 of 12 tics per 360 graden. &lt;br /&gt;
&lt;br /&gt;
Zoals gezegd moet de Arduino, bij gebruik van een Rotary Encoder, pulsen gaan tellen.&lt;br /&gt;
&lt;br /&gt;
Naast draaiing hebben sommige encoders een drukknop functie: je kunt de knop dan draaien en pulsen genereren, maar ook indrukken en dan op een extra pin een signaal geven. Daarnaast zijn er rotary encoders die echte positie informatie geven, dus niet alleen met pulsen getelde ''verandering'' van positie, maar echt de stand van de as &amp;quot;weten&amp;quot; en die gecodeerd als digitaal getal doorgeven. Een dergelijke encoder heeft natuurlijk veel meer pins, bijvoorbeeld 10 pins, om met voldoende precisie de stand door te geven. Ook bij deze encoders ben je vrij om een signaal te gebruiken dat meerdere rondes vergt zodat je zoveel precisie hebt als je maar wilt. Het aantal rondes moet dan wel worden geteld zodat het voordeel van dit type, dat het de stand kent, verdwijnt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 onderdeel  zus&lt;br /&gt;
*8 onderdelen zo van 18kΩ&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Bestand:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hier de broncode van het programma &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Motor met Power|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Rotary_Encoder&amp;diff=176</id>
		<title>Arduino - Rotary Encoder</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Rotary_Encoder&amp;diff=176"/>
				<updated>2018-02-25T13:41:32Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: Created page with &amp;quot;===Rotary Encoder=== Een Rotary Encoder lijkt erg op een potmeter die we al vaak hebben gebruikt. Potmeters hebben een weerstand met een variabel aftappunt. Vaak gebruiken we...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Rotary Encoder===&lt;br /&gt;
Een Rotary Encoder lijkt erg op een potmeter die we al vaak hebben gebruikt. Potmeters hebben een weerstand met een variabel aftappunt. Vaak gebruiken we de potmeter om een regelbare spanning te krijgen. Daarvoor hangen we de ene kant van de weerstand aan de plus en de andere kant aan de nul, zodat je op het aftappunt een variabel in te stellen spanning krijgt. De spanning is dan maatgevend voor de stand van de potmeter. Die spanning moet vervolgens wel digitaal worden uitgelezen, waarvoor we dan analoge ingang van de Arduino gebruiken. Daar ontstaat al een probleempje omdat door meetfouten en andere fluctuaties de gemeten spanning steeds een beetje anders is. Zelfs als je helemaal niet aan de potmeter zit. Een eventuele regelaar zal dus continu bij willen regelen, terwijl er eigenlijk niks gebeurt. Bij het [[Arduino - Een servo|servo-project]] hebben we het hier al een keer over gehad. Een ander probleem met normale potmeters kan ontstaan doordat ze hooguit 300 graden kunnen draaien. Soms geeft dat niet genoeg precisie. In dat geval kun je een dure ''meerslags potmeter'' kopen, maar ook dan ben je gelimiteerd. Een Rotary Encoder is een alternatief invoer apparaatje dat in dit soort gevallen uitkomst kan bieden. Uiterlijk lijken ze erg op een potmeter, maar ze werken heel anders. Dat blijkt ook uit het feit dat ze minimaal 4 aansluitpins hebben, terwijl potmeters er meestal drie hebben. In plaats van een spanning, geven Rotary Encoders pulsen af, één puls per stukje draaing. Dergelijke pulsjes kun je met een Arduino tellen. Daar komt bij dat, door een truukje ook de draai-richting kan worden bepaald zodat je kunt optellen en aftrekken. Er is in feite geen limiet voor wat betreft de precisie, maar als je heel grote precisie wilt, moet je natuurlijk wel veel draaien, al kun je daar softwarematig nog wel wat aan doen. Je slaat dan bijvoorbeeld stukken over als de pulsjes snel achter elkaar komen. Op die manier kun je lekker snel naar een bepaald punt toe, zonder in te leveren op precisie. Overigens is het aantal pulsjes per hele ronde afhankelijk van het type Rotary Encoder, waarbij meer pulsjes per ronde natuurlijk is voorbehouden voor de duurdere types. Een standaard Rotary Encoder heeft bijvoorbeeld 18 of 30 graden per tic, dus 20 of 12 tics per 360 graden. &lt;br /&gt;
&lt;br /&gt;
Naast draaiing hebben sommige encoders een drukknop functie: je kunt de knop dan draaien en pulsen genereren, maar ook indrukken en dan op een extra pin een signaal geven. Daarnaast zijn er rotary encoders die echte positie informatie geven, dus niet alleen met pulsen getelde ''verandering'' van positie, maar echt de stand van de as &amp;quot;weten&amp;quot; en die gecodeerd als digitaal getal doorgeven. Een dergelijke encoder heeft natuurlijk veel meer pins, bijvoorbeeld 10 pins, om met voldoende precisie de stand door te geven. Ook bij deze encoders ben je vrij om een signaal te gebruiken dat meerdere rondes vergt zodat je zoveel precisie hebt als je maar wilt. Het aantal rondes moet dan wel worden geteld zodat het voordeel van dit type, dat het de stand kent, verdwijnt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 onderdeel  zus&lt;br /&gt;
*8 onderdelen zo van 18kΩ&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Bestand:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hier de broncode van het programma &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Motor met Power|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_cursus&amp;diff=175</id>
		<title>Arduino cursus</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_cursus&amp;diff=175"/>
				<updated>2018-02-25T12:33:39Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dit is een bewerking van het materiaal horende bij een Chineese Arduino-learning kit. Het materiaal is prima, maar de learning kwaliteiten zijn maar matig; projecten worden gepresenteerd als recepten zonder uitleg. Ook lijkt de volgorde van de projecten didactische weinig doordacht. Het is de bedoeling om de projecten een voor een door te lopen, waarbij je het meeste leert als je met elk project wat speelt. Bij elk project staan suggesties wat je extra zou kunnen proberen.&lt;br /&gt;
&lt;br /&gt;
In principe wordt voor het Arduino platform gebruik gemaakt van de programmeertaal C++. Dit is de taal C, uitgebreid met object orientatie. Het is niet nodig om dit nu al te beheersen, maar voor extra informatie moet je dus zoeken op C en C++.&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
Het Arduino project is begonnen in Italie waar een klein team een eenvoudig standaard bordje maakte voor een ATMEL ''microcontroller'' chip. Een microcontroller is eigenlijk een klein computertje met een klein beetje geheugen aan boord en vooral met technisch handige aansluitingen waarmee signalen kunnen worden ingelezen en apparaten bestuurd kunnen worden. Het mooie van Arduino is dat het zo ontworpen is dat niet alleen dit aansluiten erg gemakkelijk is gemaakt, maar ook het programmeren van het bordje. Het echte werk wordt vervolgens gedaan door de microcontroller chip, die dus ontworpen is door ATMEL. Arduino staat overigens niet op zichzelf; er zijn andere projecten, sommigen ouder, die vergelijkbare platformpjes hebben ontwikkeld, zoals [[https://en.wikipedia.org/wiki/Wiring_(development_platform) Wiring]] en [[https://en.wikipedia.org/wiki/Fritzing Fritzing]]. Tussen de oorspronkelijke vrienden die Arduino zijn begonnen boterd het overigens niet meer; het blijkt dat een van de teamleden er met het geld vandoor is gegaan. &lt;br /&gt;
&lt;br /&gt;
Het hele Arduino project is open source wat erop neer komt dat niet alleen de hardware ontwerpen, maar ook de code van de Arduino ontwikkelomgeving software openbaar zijn en ook door anderen gebruikt mogen worden. Dat wordt dan ook veelvuldig gedaan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Arduino_team_2.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|Vanaf links: Gianluca Martino, David Mellis, David Cuartielles, Tom Igoe en Massimo Banzi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Projecten==&lt;br /&gt;
===[[Arduino - LED blinking|Project 1: Kickstart]]===&lt;br /&gt;
* Installeren van de Arduino software&lt;br /&gt;
* Aansluiten van de Arduino op de PC&lt;br /&gt;
* Een (eenvoudig) programma maken, uploaden en op de Arduino laten werken&lt;br /&gt;
* De Arduino werkt nu ook zelfstandig!&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Verkeerslicht|Project 2: Verkeerslicht]]===&lt;br /&gt;
* Iets meer programmeren&lt;br /&gt;
* De delay() functie&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Communiceren met de PC|Project 3: Communiceren met de PC]]===&lt;br /&gt;
* Introductie van het '''Serial''' object&lt;br /&gt;
* Gebruik van de '''Serial monitor'''&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - LED looplicht|Project 4: LED looplicht]]===&lt;br /&gt;
* Meer programmeren&lt;br /&gt;
* Seriele communicatie helpt bij debugging&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - LED reageert op knopje|Project 5: LED reageert op knopje]]===&lt;br /&gt;
* Aansluiten knopje&lt;br /&gt;
* Pin configureren voor digitale input&lt;br /&gt;
* Stand van knopje uitlezen&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Active Buzzer (met knop)|Project 6: Active Buzzer (met knop)]]===&lt;br /&gt;
* Een buzzer in plaats van een LED!&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - PWM|Project 7: PWM]]===&lt;br /&gt;
* Hoe, wat en waarom van PWM&lt;br /&gt;
* LED dimmer&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - RGB LED|Project 8: RGB LED]]===&lt;br /&gt;
* Meerdere kleuren maken&lt;br /&gt;
* HSL licht model&lt;br /&gt;
* Gebruik van een functie binnen de software&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Passive buzzer|Project 9: Passive buzzer]]===&lt;br /&gt;
* Programmeren van loops&lt;br /&gt;
* tone() functie&lt;br /&gt;
* Commando's vanaf de PC sturen&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Het 1602 LCD Display|Project 10: Het 1602 LCD Display]]===&lt;br /&gt;
* Tekst uitvoeren naar een LCD display&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Analog Value Reading|Project 11: Analog Value Reading]]===&lt;br /&gt;
* Gebruik van analoge ingangen&lt;br /&gt;
* Automatische AD-Conversie&lt;br /&gt;
* Gemeten signaal omzetten naar spanning&lt;br /&gt;
* LET OP &amp;lt;span style=&amp;quot;color:#0055ff&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; en &amp;lt;span style=&amp;quot;color:#0055ff&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Allerlei sensoren|Project 12: Allerlei sensoren]]===&lt;br /&gt;
* Licht meten met een LDR&lt;br /&gt;
* Vlammen detecteren met een IR flame sensor&lt;br /&gt;
* Temperatuur meten met een NTC/Thermistor&lt;br /&gt;
* Temperatuur meten met een LM35 temperature sensor&lt;br /&gt;
* Gas sensor&lt;br /&gt;
* Luchtdruk sensor&lt;br /&gt;
* Water flow sensor&lt;br /&gt;
* Temperatuur meten met een Pt100&lt;br /&gt;
* Luchtvochtigheidssensor (en temperatuur sensor)&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - 1-digit LED Segment Display|Project 13: 1-digit LED Segment Display]]===&lt;br /&gt;
* Aansturen van een LED display; tonen van een cijfer&lt;br /&gt;
* Gebruik van patronen&lt;br /&gt;
* Gebruik van array's&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - 4-digit LED Segment Display|Project 14: 4-digit LED Segment Display]]===&lt;br /&gt;
* Eigenschappen van een Segmented LED display&lt;br /&gt;
* Tonen van meerdere cijfers, onzichtbaar snel achter elkaar&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Temperatuur meten met een DS18B20 sensor|Project 15: Temperatuur meten met de digitale DS18B20 sensor]]===&lt;br /&gt;
* Digitale meting met 1-wire communicatie&lt;br /&gt;
* Meerdere sensoren koppelen&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een digitale clock|Project 16: Een digitale clock]]===&lt;br /&gt;
* De actuele datum / tijd instellen en uitlezen met een clock module&lt;br /&gt;
* Communicatie met I2C met behulp van de Wire.h library&lt;br /&gt;
* Met het display van project 11 maakt het een clock&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Infrarood afstandbediening|Project 17: Infrarood afstandbediening]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een joystick|Project 18: Een joystick]]===&lt;br /&gt;
* Leuk invoer apparaat!&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een servo|Project 19: Een servo]]===&lt;br /&gt;
* Bestuur hem met de joystick&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - De stappenmotor|Project 20: De stappenmotor]]===&lt;br /&gt;
* Hoe wat en waarom van een stappenmotor&lt;br /&gt;
* Besturen met een sensor&lt;br /&gt;
* Besturen met de joystick&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - PIR bewegingsmelder|Project 21: De PIR bewegingsmelder]]===&lt;br /&gt;
* Gebruik en opties van de PIR bewegingsmelde&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een tilt sensor|Project 22: Een tilt sensor]]===&lt;br /&gt;
* Meting van het Ja/Nee type&lt;br /&gt;
* Wachttijden, dempen met weerstand/condensator&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een 3 assige versnellingsmeter (ADXL345)|Project 23: Een 3 assige versnellingsmeter (ADXL345)]]===&lt;br /&gt;
* Meerdimensionale digitale sensor&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Shift Register 74HC595|Project 24: Minder output pins nodig met een shift register]]===&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een 8x8 RGB LED Matrix aansturen|Project 25: Een 8x8 RGB LED Matrix aansturen]]===&lt;br /&gt;
* Probleem van te veel outputs oplossen met een driver&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - WS2812 Neopixels aansturen|Project 26: Werken met NeoPixels (WS2812)]]===&lt;br /&gt;
* Introductie in NeoPixels&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - GPS ontvanger|Project 27: GPS ontvanger]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Rotary Encoder|Project 28: Rotary Encoder]]===&lt;br /&gt;
* Rotary Encoder in plaats van Potmeter&lt;br /&gt;
* Timer interrupt&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Motor met Power|Project 29: Dingen aansturen met meer power / DC Motor]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Micro-SDkaart|Project 30: Gebruik micro SDcard / gegevens opslaan]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* LED Driver&lt;br /&gt;
* Weergave op een TFT/LCD schermpje&lt;br /&gt;
* Lichtnet bedienen met een relais&lt;br /&gt;
* Lichtnet (230V AC) uitlezen (aan/uit)&lt;br /&gt;
* Zonnepaneel (doormeten en gebruiken - ook als lichtsensor te gebruiken) &lt;br /&gt;
* RFID module&lt;br /&gt;
* Ultrasonic (distance) sensor HC-SR04 &lt;br /&gt;
&lt;br /&gt;
* Demultiplexer 74154&lt;br /&gt;
* OpAmp&lt;br /&gt;
* Interrupt afhandeling (externe interrupts/timer interrupts)&lt;br /&gt;
* Arduino's praten met elkaar&lt;br /&gt;
* De Arduino via seriele poort laten praten met een (Delphi) programma op de PC/laptop&lt;br /&gt;
* ZigBee en Philips Hue&lt;br /&gt;
* Laag energieverbruik / lange batterijduur&lt;br /&gt;
* Camera&lt;br /&gt;
&lt;br /&gt;
==More then Arduino==&lt;br /&gt;
===LED driver LM3914===&lt;br /&gt;
===NodeMCU / ESP8266===&lt;br /&gt;
===Instrumentele versterker: OpAmp===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Elektronica]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=174</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=174"/>
				<updated>2018-02-24T20:08:05Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Draairichting omkeren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) NPN transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
[[MOSFET's en de brugschakeling in meer detail|Hier]] zijn overigens meer details te vinden voor als je zelf een MOSFET brugschakeling zou willen ontwerpen. Er is ook een goed werkend voorbeeld tot wel 20 Ampere bij 30 Volt.&lt;br /&gt;
&lt;br /&gt;
Al met al heb je nu een aardig idee hoe het werkt, maar echt gemakkelijk is het natuurlijk niet; het is een heel klusje om alle benodigde onderdelen goed aan te sluiten. Gelukkig zijn er voldoende alternatieven. Zo zijn er voor relatief weinig geld kant-en-klare driver boards te koop. Meestal gaat het dan om bordjes die gemaakt zijn voor het aansturen van bipolaire stappenmotoren, maar die zijn ook heel bruikbaar voor gewone gelijkstroommotoren. Voor de werking daarvan moet namelijk ook de stroomrichting worden omgekeerd zodat die ook gebasseerd zijn op de H-brug schakeling. Dergelijke bordjes zijn vaak gebasseerd op een chip met twee of soms zelfs vier ingebouwde H-brug schakelingen aan boord. Iets minder krachtig dan met losse MOSFET's maar veel gemakkelijke in gebruik. Een veelgebruikt voorbeeld is de L298N chip, inderdaad bedoeld voor bipolaire stappenmotoren. Een dergelijk bordje gaat tot zo'n 35 Volt en 2 Ampere, terwijl de logica op 5 Volt mag draaien (max 7 Volt). Prima geschikt dus voor onze Arduino. Voor deze specs moet het bordje wel uitgevoerd worden met een geschikte koeler, maar gekochte bordjes hebben vrijwel altijd een koeler. Omdat deze modules geschikt zijn voor bipolaire stappenmoteren, zijn ze gemaakt voor 2 sets van spoelen en hebben ze twee volledige H-brug schakelingen aan boord. In ondertsaand project sturen we maar een DC motor aan, maar je kunt dus ook twee motoren tegelijk mee aansturen. Of één zwaardere motor, door de beide H-bruggen parallel te gebruiken. Dan gaat hij tot 4 Ampere.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 L298N MOSFET driver module&lt;br /&gt;
*1 DC motor (bijv. 12 Volt)&lt;br /&gt;
*1 Bijpassende batterij (dan ook 12 Volt)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=173</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=173"/>
				<updated>2018-02-24T20:00:16Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* De schakeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) NPN transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
[[MOSFET's en de brugschakeling in meer detail|Hier]] zijn overigens meer details te vinden voor als je zelf een MOSFET brugschakeling zou willen ontwerpen. Er is ook een goed werkend voorbeeld tot wel 20 Ampere bij 30 Volt.&lt;br /&gt;
&lt;br /&gt;
Al met al heb je nu een aardig idee hoe het werkt, maar echt gemakkelijk is het natuurlijk niet; het is een heel klusje om alle benodigde onderdelen goed aan te sluiten. Gelukkig zijn er voldoende alternatieven. Zo zijn er voor relatief weinig geld kant-en-klare driver boards te koop. Meestal gaat het dan om bordjes die gemaakt zijn voor het aansturen van bipolaire stappenmotoren, maar die zijn ook heel bruikbaar voor gewone gelijkstroommotoren. Voor de werking daarvan moet namelijk ook de stroomrichting worden omgekeerd zodat die ook gebasseerd zijn op de H-brug schakeling. Dergelijke bordjes zijn vaak gebasseerd op een chip met twee of soms zelfs vier ingebouwde H-brug schakelingen aan boord. Iets minder krachtig dan met losse MOSFET's maar veel gemakkelijke in gebruik. Een veelgebruikt voorbeeld is de L298N chip, inderdaad bedoeld voor bipolaire stappenmotoren. Een dergelijk bordje gaat tot 45 Volt en 2 Ampere, terwijl de logica op 5 Volt mag draaien (max 7 Volt). Prima geschikt dus voor onze Arduino. Voor deze specs moet het bordje wel uitgevoerd worden met een koeler. Omdat deze modules geschikt zijn voor bipolaire stappenmoteren, zijn ze gemaakt voor 2 sets van spoelen en hebben ze twee volledige H-brug schakelingen aan boord. Hoewel we in ondertsaand project maar een motor aansturen, kun je er in principe dus ook twee DC motoren tegelijk mee aansturen.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 L298N MOSFET driver module&lt;br /&gt;
*1 DC motor (bijv. 12 Volt)&lt;br /&gt;
*1 Bijpassende batterij (dan ook 12 Volt)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=172</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=172"/>
				<updated>2018-02-24T19:59:26Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Draairichting omkeren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) NPN transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
[[MOSFET's en de brugschakeling in meer detail|Hier]] zijn overigens meer details te vinden voor als je zelf een MOSFET brugschakeling zou willen ontwerpen. Er is ook een goed werkend voorbeeld tot wel 20 Ampere bij 30 Volt.&lt;br /&gt;
&lt;br /&gt;
Al met al heb je nu een aardig idee hoe het werkt, maar echt gemakkelijk is het natuurlijk niet; het is een heel klusje om alle benodigde onderdelen goed aan te sluiten. Gelukkig zijn er voldoende alternatieven. Zo zijn er voor relatief weinig geld kant-en-klare driver boards te koop. Meestal gaat het dan om bordjes die gemaakt zijn voor het aansturen van bipolaire stappenmotoren, maar die zijn ook heel bruikbaar voor gewone gelijkstroommotoren. Voor de werking daarvan moet namelijk ook de stroomrichting worden omgekeerd zodat die ook gebasseerd zijn op de H-brug schakeling. Dergelijke bordjes zijn vaak gebasseerd op een chip met twee of soms zelfs vier ingebouwde H-brug schakelingen aan boord. Iets minder krachtig dan met losse MOSFET's maar veel gemakkelijke in gebruik. Een veelgebruikt voorbeeld is de L298N chip, inderdaad bedoeld voor bipolaire stappenmotoren. Een dergelijk bordje gaat tot 45 Volt en 2 Ampere, terwijl de logica op 5 Volt mag draaien (max 7 Volt). Prima geschikt dus voor onze Arduino. Voor deze specs moet het bordje wel uitgevoerd worden met een koeler. Omdat deze modules geschikt zijn voor bipolaire stappenmoteren, zijn ze gemaakt voor 2 sets van spoelen en hebben ze twee volledige H-brug schakelingen aan boord. Hoewel we in ondertsaand project maar een motor aansturen, kun je er in principe dus ook twee DC motoren tegelijk mee aansturen.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=MOSFET%27s_en_de_brugschakeling_in_meer_detail&amp;diff=171</id>
		<title>MOSFET's en de brugschakeling in meer detail</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=MOSFET%27s_en_de_brugschakeling_in_meer_detail&amp;diff=171"/>
				<updated>2018-02-24T18:47:02Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hieronder staat een uitwerking van de MOSFET brugschakeling die gebruikt kan worden als bi-directionele motordriver. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_full.png]]&lt;br /&gt;
|-&lt;br /&gt;
|MOSFET brugschakeling met onderdelen en weerstandswaarden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bij het project over het [[Arduino_-_Motor_met_Power#Draairichting_omkeren|aansturen met meer power]] is de kern van deze schakeling al vrij uitgebreid besproken. Hier is gekozen voor een aantal specifieke componenten. De twee N-channel MOSFET's (onderin, IRFZ40) zijn ''logic level'' MOSFET's. Dit betekent dat ze geschikt zijn om te gebruiken met ''logic level'' spanningen: spanningen tot 5 Volt. In de datasheet van deze MOSFET staan onder andere de volgende gegevens:&lt;br /&gt;
&lt;br /&gt;
    Gate-Source Threshold Voltage: 2 to 4 Volt&lt;br /&gt;
    Continuous Drain Current: 50 A (bij 25°C), 36 A (bij 100°C)&lt;br /&gt;
    V&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;: 60 Volt&lt;br /&gt;
    V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;: &amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;20 Volt&lt;br /&gt;
    R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on): 0.03 Ω&lt;br /&gt;
    Max Junction Temp: 175 °C&lt;br /&gt;
    R&amp;lt;sub&amp;gt;θJA&amp;lt;/sub&amp;gt;: 62 °C/W&lt;br /&gt;
&lt;br /&gt;
Daarnaast zijn er vele andere details over de eigenschappen van de chip, waaronder grafieken die aangeven hoe deze eigenschappen veranderen met de temperatuur. Voor hier volstaan we met bovenstaand lijstje. De '''Gate-Source Threshold Voltage''' wijst op de spanning die nodig is tussen Gate en Source om de MOSFET in de doorlaatstand te zetten. Is die spanning lager dan de threshold, dan zal de MOSFET blokkeren, daarboven zal hij doorlaten. Een veilige spanning is dus 4 Volt waarmee deze inderdaad voldoet aan de eisen voor ''logic level'' MOSFET. De tweede parameter waar we naar kijken is de '''Continuous Drain Current'''. Deze geeft aan hoeveel stroom de MOSFET continu mag leveren. De hier opgegeven waarde van 50 Ampere is natuurlijk formidabel: zelfs bij 12 Volt is deze MOSFET geschikt om een vermogen van 600 Watt te besturen. Merk wel op dat deze waarde afneemt als de MOSFET het zwaarder krigt en heter wordt (36 A bij 100°C). De derde parameter betreft de maximale spanning die bij deze MOSFET gebruikt mag worden. Deze spanning staat tussen Drain en Source en '''V&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;''' blijkt 60 Volt te zijn. Als deze waarden goed zijn kun je nog kijken naar de maximale spanning tussen Gate en Source: '''V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;''' om te zien of dat bij jouw specifieke toepassing past. Deze blijkt 20 Volt te zijn. Aannemende dat de Source aan de nul hangt, mag de Gate dus nooit meer dan 20 Volt voeren. Je mag de Gate dus niet aan voedingsspanning hangen als die hoger is dan 20 Volt. In de meeste gevallen zal dat echter geen probleem zijn. &lt;br /&gt;
&lt;br /&gt;
De volgende drie parameters hebben te maken met het energieverbruik en het opwarmen van de MOSFET. De parameter '''R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on)''' geeft aan hoe groot de weerstand is van de MOSFET tussen Drain en Source als hij ''aan'' staat (dus volledig geleidend is). Deze blijkt slechts 0.03 Ω te zijn. Doordat deze weerstand zo laag is, zal de MOSFET niet veel opwarmen. Als er I ampere door de MOSFET loopt, is de energie die wordt geproduceerd gelijk aan:&lt;br /&gt;
&lt;br /&gt;
    P = R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on) * I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bij een stroom van 5 Ampere komen we dan op een energie van 0.03*25 = 0.75 Watt. Dit loopt snel op met de stroom: bij 10 Ampere is het namelijk al 3 Watt. Dit is belangrijk omdat de MOSFET niet te heet mag worden: de '''Max Junction Temperature''' is 175 °C. Dat is natuurlijk best hoog, maar met meer vermogen kan zo'n klein ding snel heter worden. Daarvoor hebben we dan de laatste parameter nodig: '''R&amp;lt;sub&amp;gt;θJA&amp;lt;/sub&amp;gt;'''. Deze is 62 °C/W. Dat betekent dat de kale chip, zonder koeling, 62 °C zal opwarmen per Watt die de MOSFET gebruikt. Als dat 0.75 Watt is, zal de MOSFET dus 0.75*62 = 46,5°C opwarmen (ongeveer - neem dit soort getallen altijd met een ruime marge). Geen probleem, zelfs niet als het in de omgeving 40°C is, en zelfs bij 80°C in een sauna zal het ding probleemloos moeten werken. Maar bij 10 Ampere is het verbruik 3 Watt en komt de opwarming uit op 3*62 = 186°C. Dit is op zich al te hoog, maar je moet daar ook de omgevingstemperatuur nog bij optellen. Dan kom je al snel uit boven de 200°C: zonder extra koeling gaat je MOSFET kapot! Bij nog grotere stromen moet je dus een behoorlijk koellichaam gebruiken om de MOSFET te koelen. Uiteraard is het verstandig om ruim buiten de maximale waarden te blijven. Een van de dingen die bijvoorbeeld zouden kunnen gebeuren is dat de R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on) hoger wordt als de temperatuur stijgt. De weerstand neemt dan toe als de MOSFET heter wordt, waardoor hij meer energie gaat gebruiken en hij sneller zal opwarmen dan dat je hebt berekend.&lt;br /&gt;
&lt;br /&gt;
Kijken we nu naar de datasheet van de P-channel MOSFET IRF9Z30, dan vinden we het volgende:&lt;br /&gt;
    Gate-Source Threshold Voltage: -2 to -4 Volt&lt;br /&gt;
    Continuous Drain Current: -18 A (bij 25°C), -11 A (bij 100°C)&lt;br /&gt;
    V&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;: -50 Volt&lt;br /&gt;
    V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;: &amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;20 Volt&lt;br /&gt;
    R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on): 0.14 Ω  (een stuk hoger!!)&lt;br /&gt;
    Max Junction Temp: 150 °C&lt;br /&gt;
    R&amp;lt;sub&amp;gt;θJA&amp;lt;/sub&amp;gt;: 80 °C/W&lt;br /&gt;
Ten eerste valt op dat de genoemde spanningen hier negatief zijn. Dat heeft alleen te maken met het feit dat de Source aan de plus hangt en Gate en Drain dus aan ''lagere'' spanningen zitten dan de Source. In elk geval moet de spanning op de gate hoger worden van V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;-2 Volt om de MOSFET in blokkering te krijgen en lager van V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;-4 Volt om hem ''aan'' te zetten. Nog lager is beter, maar ga in elk geval niet lager dan V&amp;lt;sub&amp;gt;CC&amp;lt;/sub&amp;gt;-20 Volt omdat de MOSFET anders kapot gaat (V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt; is maximaal &amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;20 Volt). Ook de maximale stroom die deze MOSFET's mogen hebben is een heel stuk lager dan de vorige. Dit heeft zonder twijfel te maken met de temperatuur-eigenschappen en dan vooral de relatief hoge D-S weerstand: R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on) = 0.14 Ω. Daardoor produceert deze MOSFET meer warmte bij dezelfde stroom en die warmte wordt niet navenant sneller afgevoerd. Daar komt bij dat hij minder hitte kan hebben: tot max 150°C. Hij wordt dus sneller te heet en kan daardoor minder stroom aan.&lt;br /&gt;
&lt;br /&gt;
Het zal duidelijk zijn dat de P-cahnnel MOSFET in bovengenoemde schakeling eerder een probleem vormt dan de N-channel MOSFET. Als jouw specifieke toepassing tegen de grenzen aanloopt van deze MOSFET, kun je proberen om een betere alternatieven te vinden en dan in de eerste plaats voor de P-channel MOSFET. Je komt dan bijvoorbeeld de '''FQP27P06''' tegen. Deze heeft de volgende parameters:&lt;br /&gt;
    Gate-Source Threshold Voltage: -2 to -4 Volt&lt;br /&gt;
    Continuous Drain Current: -27 A (bij 25°C), -19.1 A (bij 100°C)&lt;br /&gt;
    V&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;: -60 Volt&lt;br /&gt;
    V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;: &amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;25 Volt&lt;br /&gt;
    R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on): 0.07 Ω&lt;br /&gt;
    Max Junction Temp: 175 °C&lt;br /&gt;
    R&amp;lt;sub&amp;gt;θJA&amp;lt;/sub&amp;gt;: 62.5 °C/W&lt;br /&gt;
Deze past wat beter bij de IRFZ40 dan de in het schema gebruikte IRF9Z30 zodat je, met de juiste koeling, tot wel 20 Ampere kunt regelen.&lt;br /&gt;
&lt;br /&gt;
In theorie kun je bovenstaande schakeling ook gebruiken voor het aansturen van bi-directionele stappenmotoren. In dat geval heb je meestal te maken met (minimaal) twee groepen van spoelen en heb je dus twee volledige brug-schakelingen nodig. Bovenstaande schakeling is pas echt nuttig voor echt zware toepasingen. Voor minder zware toepassingen zijn er chips te koop met kant-en-klare brugschakelingen, geschikt voor een redelijk vermogen. Dit soort chips hebben vaak twee brugschakelingen aan boord en zijn dan vaak ook bedoeld voor het aansturen van stappenmotoren, maar ze zijn ook zonder meer geschikt voor het aansturen van gewone gelijkstroommotoren.&lt;br /&gt;
&lt;br /&gt;
De L298N beschikt bijvoorbeeld over twee volledige H-bruggen en is geschikt voor (stappen)motoren tot 2A. Als je de beide H-bruggen parallel schakelt kun je er ook een DC motor mee aansturen tot 4A.&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=MOSFET%27s_en_de_brugschakeling_in_meer_detail&amp;diff=170</id>
		<title>MOSFET's en de brugschakeling in meer detail</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=MOSFET%27s_en_de_brugschakeling_in_meer_detail&amp;diff=170"/>
				<updated>2018-02-24T18:23:19Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: Created page with &amp;quot;Hieronder staat een uitwerking van de MOSFET brugschakeling die gebruikt kan worden als bi-directionele motordriver.   {|class=&amp;quot;wikitable&amp;quot; |- |File:MOSFET_brugschakeling_ful...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hieronder staat een uitwerking van de MOSFET brugschakeling die gebruikt kan worden als bi-directionele motordriver. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_full.png]]&lt;br /&gt;
|-&lt;br /&gt;
|MOSFET brugschakeling met onderdelen en weerstandswaarden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bij het project over het [[Arduino_-_Motor_met_Power#Draairichting_omkeren|aansturen met meer power]] is de kern van deze schakeling al vrij uitgebreid besproken. Hier is gekozen voor een aantal specifieke componenten. De twee N-channel MOSFET's (onderin, IRFZ40) zijn ''logic level'' MOSFET's. Dit betekent dat ze geschikt zijn om te gebruiken met ''logic level'' spanningen: spanningen tot 5 Volt. In de datasheet van deze MOSFET staan onder andere de volgende gegevens:&lt;br /&gt;
&lt;br /&gt;
    Gate-Source Threshold Voltage: 2 to 4 Volt&lt;br /&gt;
    Continuous Drain Current: 50 A (bij 25°C), 36 A (bij 100°C)&lt;br /&gt;
    V&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;: 60 Volt&lt;br /&gt;
    V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;: &amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;20 Volt&lt;br /&gt;
    R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on): 0.03 Ω&lt;br /&gt;
    Max Junction Temp: 175 °C&lt;br /&gt;
    R&amp;lt;sub&amp;gt;θJA&amp;lt;/sub&amp;gt;: 62 °C/W&lt;br /&gt;
&lt;br /&gt;
Daarnaast zijn er vele andere details over de eigenschappen van de chip, waaronder grafieken die aangeven hoe deze eigenschappen veranderen met de temperatuur. Voor hier volstaan we met bovenstaand lijstje. De '''Gate-Source Threshold Voltage''' wijst op de spanning die nodig is tussen Gate en Source om de MOSFET in de doorlaatstand te zetten. Is die spanning lager dan de threshold, dan zal de MOSFET blokkeren, daarboven zal hij doorlaten. Een veilige spanning is dus 4 Volt waarmee deze inderdaad voldoet aan de eisen voor ''logic level'' MOSFET. De tweede parameter waar we naar kijken is de '''Continuous Drain Current'''. Deze geeft aan hoeveel stroom de MOSFET continu mag leveren. De hier opgegeven waarde van 50 Ampere is natuurlijk formidabel: zelfs bij 12 Volt is deze MOSFET geschikt om een vermogen van 600 Watt te besturen. Merk wel op dat deze waarde afneemt als de MOSFET het zwaarder krigt en heter wordt (36 A bij 100°C). De derde parameter betreft de maximale spanning die bij deze MOSFET gebruikt mag worden. Deze spanning staat tussen Drain en Source en '''V&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;''' blijkt 60 Volt te zijn. Als deze waarden goed zijn kun je nog kijken naar de maximale spanning tussen Gate en Source: '''V&amp;lt;sub&amp;gt;GS&amp;lt;/sub&amp;gt;''' om te zien of dat bij jouw specifieke toepassing past. Deze blijkt 20 Volt te zijn. Aannemende dat de Source aan de nul hangt, mag de Gate dus nooit meer dan 20 Volt voeren. Je mag de Gate dus niet aan voedingsspanning hangen als die hoger is dan 20 Volt. In de meeste gevallen zal dat echter geen probleem zijn. &lt;br /&gt;
&lt;br /&gt;
De volgende drie parameters hebben te maken met het energieverbruik en het opwarmen van de MOSFET. De parameter '''R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on)''' geeft aan hoe groot de weerstand is van de MOSFET tussen Drain en Source als hij ''aan'' staat (dus volledig geleidend is). Deze blijkt slechts 0.03 Ω te zijn. Doordat deze weerstand zo laag is, zal de MOSFET niet veel opwarmen. Als er I ampere door de MOSFET loopt, is de energie die wordt geproduceerd gelijk aan:&lt;br /&gt;
&lt;br /&gt;
    P = R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on) * I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bij een stroom van 5 Ampere komen we dan op een energie van 0.03*25 = 0.75 Watt. Dit loopt snel op met de stroom: bij 10 Ampere is het namelijk al 3 Watt. Dit is belangrijk omdat de MOSFET niet te heet mag worden: de '''Max Junction Temperature''' is 175 °C. Dat is natuurlijk best hoog, maar met meer vermogen kan zo'n klein ding snel heter worden. Daarvoor hebben we dan de laatste parameter nodig: '''R&amp;lt;sub&amp;gt;θJA&amp;lt;/sub&amp;gt;'''. Deze is 62 °C/W. Dat betekent dat de kale chip, zonder koeling, 62 °C zal opwarmen per Watt die de MOSFET gebruikt. Als dat 0.75 Watt is, zal de MOSFET dus 0.75*62 = 46,5°C opwarmen (ongeveer - neem dit soort getallen altijd met een ruime marge). Geen probleem, zelfs niet als het in de omgeving 40°C is, en zelfs bij 80°C in een sauna zal het ding probleemloos moeten werken. Maar bij 10 Ampere is het verbruik 3 Watt en komt de opwarming uit op 3*62 = 186°C. Dit is op zich al te hoog, maar je moet daar ook de omgevingstemperatuur nog bij optellen. Dan kom je al snel uit boven de 200°C: zonder extra koeling gaat je MOSFET kapot! Bij nog grotere stromen moet je dus een behoorlijk koellichaam gebruiken om de MOSFET te koelen. Uiteraard is het verstandig om ruim buiten de maximale waarden te blijven. Een van de dingen die bijvoorbeeld zouden kunnen gebeuren is dat de R&amp;lt;sub&amp;gt;DS&amp;lt;/sub&amp;gt;(on) hoger wordt als de temperatuur stijgt. De weerstand neemt dan toe als de MOSFET heter wordt, waardoor hij meer energie gaat gebruiken en hij sneller zal opwarmen dan dat je hebt berekend.&lt;br /&gt;
&lt;br /&gt;
In theorie kun je bovenstaande schakeling ook gebruiken voor het aansturen van bi-directionele stappenmotoren, maar meestal heb je dan te maken met twee groepen van spoelen en heb je dus twee brug-schakelingen nodig. Daarbij is deze schakeling pas echt nuttig voor echt zware toepasingen. Voor minder zware toepassingen zijn er chips te koop met kant en klare brugschakelingen, geschikt voor een redelijk vermogen. Dit soort chips hebben vaak twee brugschakelingen aan boord en zijn dan vaak ook bedoeld voor het aansturen van stappenmotoren, maar ze zijn ook zonder meer geschikt voor het aansturen van gewone gelijkstroommotoren.&lt;br /&gt;
&lt;br /&gt;
De L298N beschikt bijvoorbeeld over twee volledige H-bruggen en is geschikt voor (stappen)motoren tot 2A. Als je de beide H-bruggen parallel schakelt kun je er ook een DC motor mee aansturen tot 4A.&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=169</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=169"/>
				<updated>2018-02-24T16:57:45Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Draairichting omkeren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) NPN transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
[[MOSFET's en de brugschakeling in meer detail|Hier]] zijn overigens meer details te vinden voor als je zelf een MOSFET brugschakeling zou willen ontwerpen. Er is ook een goed werkend voorbeeld tot wel 20 Ampere bij 30 Volt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:MOSFET_brugschakeling_full.png&amp;diff=168</id>
		<title>File:MOSFET brugschakeling full.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:MOSFET_brugschakeling_full.png&amp;diff=168"/>
				<updated>2018-02-24T15:27:31Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=167</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=167"/>
				<updated>2018-02-24T11:35:17Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Draairichting omkeren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Hieronder laten we nu het principe zien van de brugschakeling met vier MOSFET's voor de schakelaars. De dikke lijnen geven aan waar veel stroom kan lopen. De dunne lijnen zijn voor zwakke stuursignalen. De bovenste twee MOSFET's zijn van het P-type en de onderste twee van het N-type. De schakeling heeft twee PWM signalen nodig; beide richtingen worden afzonderlijk aangestuurd. Daar komt bij dat je ervoor moet zorgen dat als je '''PWM A''' wilt gebruiken (de ene draairichting) '''ON A''' hoog is (en '''ON B''' laag) en als je PWM B wilt gebruiken (de andere draairichting) '''ON B''' hoog moet zijn en ('''ON A''' laag). Als zowel '''ON A''' als '''ON B''' laag zijn draait de motor sowieso niet omdat dan beide P-channel MOSFET's zullen blokkeren. Ze beide hoog maken is een slecht idee omdat er dan kortsluiting ontstaat zodra een van de PWM ingangen even hoog wordt. De motor zal dan ook niet lopen, maar in plaats daarvan gaan je FET's eraan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling_simple.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Naast de vier MOSFET's gebruikt bovenstaande schakeling nog twee andere (gewone) transistors. Deze worden hier alsvolgt gebruikt. Een spanning op '''ON A''' komt via de weerstand bij de basis (b) van de transistor terecht. Als die spanning voert, laat de NPN transistor stroom door van c (collector) naar e (emitter). Het gevolg is dat de gate van de P-channel MOSFET via de weerstanden voldoende laag gemaakt wordt om de P-channel MOSFET in geleiding te brengen. Als de spanning op '''ON A''' wegvalt, wordt de Gate gelijk aan de voedingsspanning en dus aan de spanning op de Source, waardoor de MOSFET gaat blokkeren. Hetzelfde geldt voor '''ON B'''. De bovenste MOSFET's staan dus continu aan of uit, terwijl het PWM signaal alleen op de onderste MOSFET's wordt gebruikt. Dit is des te meer een prima idee omdat de N-channel MOSFET's in het algemeen wat sneller schakelen dan de P-channel MOSFET's.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:MOSFET_brugschakeling_simple.png&amp;diff=166</id>
		<title>File:MOSFET brugschakeling simple.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:MOSFET_brugschakeling_simple.png&amp;diff=166"/>
				<updated>2018-02-24T11:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: WikiAdmin uploaded a new version of File:MOSFET brugschakeling simple.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:MOSFET_brugschakeling_simple.png&amp;diff=165</id>
		<title>File:MOSFET brugschakeling simple.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:MOSFET_brugschakeling_simple.png&amp;diff=165"/>
				<updated>2018-02-24T11:10:52Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=164</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=164"/>
				<updated>2018-02-24T09:08:28Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Draairichting omkeren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotor-project]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Onthoud altijd goed dat je bij een brug-schakeling &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande schakelaars sluit, want dan krijg je kortsluiting en gaan er dingen kapot. Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET blokkeert of doorlaat. Als hij doorlaat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem volledig op doorlaten te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij stroom gaat doorlaten, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt). &lt;br /&gt;
&lt;br /&gt;
Als we even aannemen dat we de motor ook op 5 Volt laten draaien, zie je dat het signaal laag moet zijn om een van de bovenste MOSFET's in geleiding te krijgen, terwijl hij bij een hoge spanning juist blokkeert. De onderste MOSFET's doen het precies andersom. Nu kun je de bovenste prima het PWM signaal prima&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Brugschakeling met P-channel en N-channel MOSFET's|}&lt;br /&gt;
&lt;br /&gt;
Zo'n brugschakeling heeft vier MOSFET's nodig, terwijl je voor een snelheidsregeling in één richting met een enkele MOSFET kunt volstaan. Dat kan zelfs al als het maar heel kort is.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=163</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=163"/>
				<updated>2018-02-24T08:50:01Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* MOSFET driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde. Daarnaast kan de output van de Arduino naar nul worden getrokken met een weerstand zodat het signaal sneller naar nul kan gaan. Beide extra weerstanden zijn opties en worden in de meeste schakelingen weggelaten.&lt;br /&gt;
&lt;br /&gt;
===Draairichting omkeren===&lt;br /&gt;
&lt;br /&gt;
De schakeling uit de vorige paragraaf voldoet als je de motor alleen aan en uit wilt zetten, of alleen de motorsnelheid wilt besturen. In veel gevallen wil je echter ook dat de motor achteruit kan draaien. Voor het veranderen van de draairichting moet je de motor in een brug-schakeling opnemen. Deze is eerder besrpoken bij het [[Arduino_-_De_stappenmotor#Werking|stappenmotorproject]].&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Motorspoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Natuurlijk gebruiken we ook hier MOSFETs in plaats van schakelaars. De MOSFET die we hierboven hebben gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van een positief spanningsverschil tussen Gate en Source. De Source is verbonden met aarde (nul) en de Gate met het input signaal. Als de Gate dan 5 Volt krijgt is de MOSFET open en anders zit hij dicht. De essentie is nu: de Gate voert 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat normaal een onbeduidend detail. Maar als je nu nog eens goed naar de burgschakeling kijkt, dan zie je dat het hier wat anders ligt. De bovenste MOSFET's hangen met de ene kant aan de plus, terwijlde spanning op de andere kant (voorheen de Source) ervan afhangt of de MOSFET open staat of blokkeert. Als hij open staat wordt die spanning ook hoog, blokkeert hij, dan wordt die spanning laag. Stel nu dat we hier ook een N-channel MOSFET zouden gebruiken. Dan moet de Gate, om hem open te zetten, een hogere spanning krijgen dan de Source (bijvoorbeeld 5 Volt hoger, de exacte spanning hangt af van het precieze type MOSFET). Maar zodra hij dan opent, neemt de spanning op de Source toe en komt die zo'n beetje aan de plus te hangen. Dan zou hij dus weer meteen sluiten. Dat gaat dus niet goed. Daarbij wil je soms dat de motor op een veel hogere spanning draait dan de 5 Volt van je Arduino. Dat lukt natuurlijk nooit met alleen je Arduino.&lt;br /&gt;
&lt;br /&gt;
Gelukkig is er nog en ander type MOSFET: de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en ook iets lastiger te begrijpen. Daarbij wordt hier de Source aan de plus gehangen terwijl de Drain naar de motor loopt. De spanning op de Source zit dus hoger dan die op de Drain. Zo werkt ook het schakelgedrag: de MOSFET opent als de Gate een spanning voert die (bijvoorbeeld 5 Volt) '''lager''' is dan de Source en hij sluit als de Gate een spanning krijgt die gelijk is aan die van de Source (of daar voldoende dichtbij komt).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Met bovenstaande schakling kun je de motor harder en zachter laten lopen, maar je kunt de draairichting er niet mee omkeren. Om dat te doen heb je een brug-schakeling nodig die de stroomrichting en dus de draairichting wel kan omkeren. Deze schakeling hebben we al besproken bij de [[Arduino_-_De_stappenmotor#Werking|stappenmotor]]. Zo'n brugschakeling heeft vier MOSFET's nodig, terwijl je voor een snelheidsregeling in één richting met een enkele MOSFET kunt volstaan. Daarbij moet je met de aansturing heel goed opletten dat je &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande MOSFET's tegelijk open zet, want dan krijg je kortsluiting en gaan er dingen kapot. Dat kan zelfs al als het maar heel kort is.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=162</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=162"/>
				<updated>2018-02-18T19:30:12Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* MOSFET driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. Preciezer: het werkt als een spanninggestuurde schakelaar. Het gaat dan om de spanning aan de '''Gate''' ten opzichte van die aan de '''Source''' terwijl de '''Gate''' een vrijwel geen stroom opneemt. Nog preciezer: de MOSFET blokkeert de stroom als de spanning tussen Gate en Source onder een drempelwaarde ligt en laat maximaal door . Bij gate-spanningen daartussen is de stroom door de MOSFET ongeveer evenredig met de spanning. Dit is nu echter ongunstig omdat de MOSFET dan (veel) vermogen opneemt en heet kan worden. We gebruiklen hem dus alleen in volledig geblokkeerde toestand en volledig verzadigde toestand.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via (N-channel) MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet helemaal waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een spanning kan ontstaan die zo hoog kan zijn dat hij schadelijk is voor de Arduino en/of de MOSFET. Deze spanning wordt ook wel aangeduidt als de ''back EMF''. De diode is hiervoor bedoeld: het kortsluiten en dus onschadelijk maken van de ''back-EMF''. Als je in plaats van een motor een lamp wilt aansturen, kun je deze diode weglaten. Lampen geven namelijk geen back-EMF. Overigens hebben veel MOSFET's ook een ingebouwde diode (omgekeerd: van Source naar Drain) die ze beschermd tegen dit soort spanningen.&lt;br /&gt;
&lt;br /&gt;
Het bovenstaande schema zal zeker wel werken, maar het is altijd beter om een weerstand op te nemen in de lijn met het PWM signaal. Dit is ook om de Arduino te beschermen. Een weerstand van 10kΩ is meestal een goede waarde.&lt;br /&gt;
&lt;br /&gt;
De MOSFET die hier wordt gebruikt is een zogenaamde '''N-channel MOSFET'''. Dit type schakelt op basis van het verschil in spanning tussen Gate en Source. Als er op de Gate 5 Volt staat is de MOSFET open en anders zit hij dicht. Met 5 volt bedoelen we: 5 Volt meer dan op de Source. Omdat de Source aan de nul hangt is dat echter een onbeduidend detail. Een ander type MOSFET is de zogenaamde '''P-channel MOSFET'''. Deze wordt iets anders getekend (het pijltje van de Gate loopt andersom) en het schakelgedrag is net andersom en iets lastiger te begrijpen. &lt;br /&gt;
&lt;br /&gt;
Met bovenstaande schakling kun je de motor harder en zachter laten lopen, maar je kunt de draairichting er niet mee omkeren. Om dat te doen heb je een brug-schakeling nodig die de stroomrichting en dus de draairichting wel kan omkeren. Deze schakeling hebben we al besproken bij de [[Arduino_-_De_stappenmotor#Werking|stappenmotor]]. Zo'n brugschakeling heeft vier MOSFET's nodig, terwijl je voor een snelheidsregeling in één richting met een enkele MOSFET kunt volstaan. Daarbij moet je met de aansturing heel goed opletten dat je &amp;lt;u&amp;gt;nooit&amp;lt;/u&amp;gt; de twee boven elkaar staande MOSFET's tegelijk open zet, want dan krijg je kortsluiting en gaan er dingen kapot. Dat kan zelfs al als het maar heel kort is.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=161</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=161"/>
				<updated>2018-02-18T13:08:49Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:MOSFET_aansturing.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Arduino stuurt motor aan via MOSFET&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De '''Gate''' van de MOSFET krijgt het PWM signaal van de Arduino. Als het PWM signaal laag is, blokkeert de MOSET en kan er geen stroom door de motor lopen, maar als het signaal hoog is, wordt de weerstand van de MOSFET tussen '''Drain''' en '''Source''' (bijna) nul en krijgt de motor de volle lading van de Vdd. Daarbij kan een MOSFET heel snel schakelen en verbruikt die zelf dus maar heel weinig vermogen. Vdd is de voedingsspanning waar de motor op loopt. Deze mag gekoppeld zijn aan de +5 Volt die ook de Arduino voedt, maar dat hoeft niet en mag ook uit een andere bron komen (zoals in bovenstaand schema). Je kunt dan motoren gebruiken die op een heel andere spanning draaien dan de Arduino. Het is wel belangrijk dat de nul van de voeding van de Arduino gekoppeld wordt aan de nul van de motorvoeding.&lt;br /&gt;
De dikke lijnen door de motor en MOSFET geven aan dat hier veel stroom mag lopen. De maximale stroom door de MOSFET hangt af van het type dat wordt gekozen en ook of die wel of niet gekoeld wordt. Er zijn MOSFET's die wel 100 ampere kunnen schakelen!&lt;br /&gt;
&lt;br /&gt;
Dan zien we nog een klein detail: de diode over de motor. Een diode is een elementje waar de stroom maar in één richting doorheen kan. Zoals je ziet zit de diode ''verkeerd om'', waardoor er geen stroom doorheen kan lopen. Het lijkt er daarom voor niets in te zitten. Dat is echter niet waar. De motor bevat spoelen en spoelen hebben de neiging om de stroom constant te houden. Als er dus een stroom van Vdd naar nul loopt (als het PWM signaal hoog is), en de MOSFET gaat blokkeren op het moment dat PWM laag wordt, zorgen de spoelen in de motor ervoor dat er toch nog even een stroom blijft lopen. Het gevolg is dat er op de Drain een flinke spanning kan ontstaan die schadelijk kan zijn voor de Arduino en/of de MOSFET zelf. Daarvoor dient de diode, die precies deze spanning kortsluit waardoor er geen schade wordt aangericht.&lt;br /&gt;
&lt;br /&gt;
Overigens heb je voor een brug-schakeling (zie bij [[Arduino_-_De_stappenmotor#Werking|stappenmotor]]) vier MOSFET's nodig, terwijl je voor een snelheidsregeling in één richting met een enkele MOSFET kunt volstaan.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:MOSFET_aansturing.png&amp;diff=160</id>
		<title>File:MOSFET aansturing.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:MOSFET_aansturing.png&amp;diff=160"/>
				<updated>2018-02-18T12:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=159</id>
		<title>Arduino - Motor met Power</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_Motor_met_Power&amp;diff=159"/>
				<updated>2018-02-18T10:21:50Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: Created page with &amp;quot;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektri...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een Arduino is prima om een paar LEDjes aan te sturen en eventueel een klein servo-motortje. Maar als je wat meer wilt, zoals veel LEDjes aansturen, of een behoorlijke elektrische motor, volstaat een Arduino niet meer. Toch kun je kunt zo'n motor wel aansluiten met een Arduino, en dan bijvoorbeeld de PWM mogelijkheden ervan gebruiken, maar dan kan het vermogen niet van de Arduino zelf komen; alleen het stuursignaal. Dit kan heel goed met een MOSFET driver. Zo'n MOSFET werkt als een heel snelle, elektronisch aanstuurbare schakelaar, die gemakkelijk mee kan doen met het signaal van de PWM. Daar komt als voordeel bij dat je een andere spanningsbron kunt gebruiken voor de motor. De motor kan bijvoorbeeld op een dikke acuu van 24 Volt werken, terwijl de Arduino het doet met een batterijtje van 5 Volt. &lt;br /&gt;
&lt;br /&gt;
===MOSFET driver===&lt;br /&gt;
&lt;br /&gt;
Bij de [[Arduino - De stappenmotor|stappenmotor]] hebben we die drivers al voorbij zien komen, maar er niet veel aandacht aan besteed. Nu gaan we iets dieper in op dergelijke drivers. Zoals gezegd werkt een MOSFET als een elektronisch bestuurbare schakelaar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Overigens heb je voor een brug-schakeling (zie bij [[Arduino_-_De_stappenmotor#Werking|stappenmotor]]) vier MOSFET's nodig, terwijl je voor een snelheidsregeling in één richting met een enkele MOSFET kunt volstaan.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 MOSFET driver module&lt;br /&gt;
*1 DC motor&lt;br /&gt;
*1 Bijpassende batterij&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Bestand:naam bestand.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Beschrijving bovenstaande figuur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int motor=10;&lt;br /&gt;
int wait=10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(motor,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  for (int i=0; i&amp;lt;256; i++) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
  for (int i=254; i&amp;gt;=0; i--) {&lt;br /&gt;
    analogWrite(motor,i);&lt;br /&gt;
    delay(wait);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
Het programma is uiterst simpel. De loop heeft twee delen waarin de motor eerst steeds meer vermogen krijgt en daarna steeds minder. Als het programma draait zul je zien dat de motor steeds sneller gaat draaien en dan weer afremt om meteen daarna weer te versnellen. En zo voort. Uiteraard kun je de motorsnelheid programmatisch aan bepaalde inputs koppelen en de snelheid regelen met bijvoorbeeld een potmeter. In dit project willen we alleen laten zien hoe je een zwaardere motor aan kunt sturen met een Arduino.&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Leuk om zo'n motor aan te sturen, maar wat nu als de motor ook achteruit moet kunnen draaien?&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - GPS ontvanger|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - Micro-SDkaart|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=158</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=158"/>
				<updated>2018-02-18T10:15:38Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Werking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:VariableReluctanceStepper.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Werking stappenmotor: Als spoel C stroom krijgt, draait de as punt 5 naar spoel C; Als daarna spoel D stroom krijgt, draait daarna punt 4 naar spoel D; Spoel A trekt daarna punt 3 naar spoel A. Enz. De volgorde zorgt voor de draaing (en hier ook de draairichting).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf of zes draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is dat drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Dit stappenmotortje is vrij populair, vooral vanwege zijn lage prijs: minder dan €5 (en dat is dan inclusief driver module). Hoewel het vaak prima motortjes zijn moet je wel een beetje oppassen. Ondanks dat ze steevast worden aangeduidt met hetzelfde typenummer ''28BYJ-48'' en je van buiten weinig verschil zult zien, gaat het in dit geval bepaald niet steeds om hetzelfde ding. Er bestaan versies met behoorlijk afwijkende specificaties. De meeste versies zijn voor 5 Volt, maar sommige lopen op 12 Volt. Er zijn, ook voor een gegeven voltage, verschillen in de weerstand van de spoelen en dus in stroomverbruik en kracht. Daarnaast zijn er grote verschillen en de ingebouwde tandwielvertraging. Hoewel de versies sterk op elkaar lijken hebben sommige meer dan 4000 stappen per rotatie, terwijl andere slechts 32 stappen per rotatie vragen. Gegevens op Internet zijn erg onbetrouwbaar. Vaak kun je in tabellen vinden dat de 12 Volt versie evenveel torque (kracht) geeft als een 5 Volt versie, terwijl dat erg onwaarschijnlijk is. [https://grahamwideman.wikispaces.com/Motors-+28BYJ-48+Stepper+motor+notes Hier] een uitgebried rapport van iemand die het e.e.a. heeft proberen na te gaan. Boodschap: onderzoek je eigen motor en vertrouw niet blindelings op de specs.&lt;br /&gt;
&lt;br /&gt;
Wat alle types wel gemeen hebben is dat het gaat om een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Liefst gebruik je hierbij voor de stappenmotor ook een externe voeding (bijvoorbeeld van een powerbank). Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is (meestal!) bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt (maar er zijn dus ook versies met hetzelfde typenummer, die tot 12 Volt gaan).&lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een afstand van een meter van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Stepper.h&amp;gt;&lt;br /&gt;
#define STEPS 4076&lt;br /&gt;
Stepper myStepper(STEPS, 8, 9, 10, 11);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  myStepper.setSpeed(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  myStepper.step(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=157</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=157"/>
				<updated>2018-02-17T15:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:VariableReluctanceStepper.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Werking stappenmotor: Als spoel C stroom krijgt, draait de as punt 5 naar spoel C; Als daarna spoel D stroom krijgt, draait daarna punt 4 naar spoel D; Spoel A trekt daarna punt 3 naar spoel A. Enz. De volgorde zorgt voor de draaing (en hier ook de draairichting).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf of zes draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Dit stappenmotortje is vrij populair, vooral vanwege zijn lage prijs: minder dan €5 (en dat is dan inclusief driver module). Hoewel het vaak prima motortjes zijn moet je wel een beetje oppassen. Ondanks dat ze steevast worden aangeduidt met hetzelfde typenummer ''28BYJ-48'' en je van buiten weinig verschil zult zien, gaat het in dit geval bepaald niet steeds om hetzelfde ding. Er bestaan versies met behoorlijk afwijkende specificaties. De meeste versies zijn voor 5 Volt, maar sommige lopen op 12 Volt. Er zijn, ook voor een gegeven voltage, verschillen in de weerstand van de spoelen en dus in stroomverbruik en kracht. Daarnaast zijn er grote verschillen en de ingebouwde tandwielvertraging. Hoewel de versies sterk op elkaar lijken hebben sommige meer dan 4000 stappen per rotatie, terwijl andere slechts 32 stappen per rotatie vragen. Gegevens op Internet zijn erg onbetrouwbaar. Vaak kun je in tabellen vinden dat de 12 Volt versie evenveel torque (kracht) geeft als een 5 Volt versie, terwijl dat erg onwaarschijnlijk is. [https://grahamwideman.wikispaces.com/Motors-+28BYJ-48+Stepper+motor+notes Hier] een uitgebried rapport van iemand die het e.e.a. heeft proberen na te gaan. Boodschap: onderzoek je eigen motor en vertrouw niet blindelings op de specs.&lt;br /&gt;
&lt;br /&gt;
Wat alle types wel gemeen hebben is dat het gaat om een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Liefst gebruik je hierbij voor de stappenmotor ook een externe voeding (bijvoorbeeld van een powerbank). Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is (meestal!) bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt (maar er zijn dus ook versies met hetzelfde typenummer, die tot 12 Volt gaan).&lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een afstand van een meter van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Stepper.h&amp;gt;&lt;br /&gt;
#define STEPS 4076&lt;br /&gt;
Stepper myStepper(STEPS, 8, 9, 10, 11);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  myStepper.setSpeed(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  myStepper.step(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:VariableReluctanceStepper.png&amp;diff=156</id>
		<title>File:VariableReluctanceStepper.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:VariableReluctanceStepper.png&amp;diff=156"/>
				<updated>2018-02-17T15:13:42Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_cursus&amp;diff=155</id>
		<title>Arduino cursus</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_cursus&amp;diff=155"/>
				<updated>2018-02-05T12:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Project 27: GPS ontvanger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dit is een bewerking van het materiaal horende bij een Chineese Arduino-learning kit. Het materiaal is prima, maar de learning kwaliteiten zijn maar matig; projecten worden gepresenteerd als recepten zonder uitleg. Ook lijkt de volgorde van de projecten didactische weinig doordacht. Het is de bedoeling om de projecten een voor een door te lopen, waarbij je het meeste leert als je met elk project wat speelt. Bij elk project staan suggesties wat je extra zou kunnen proberen.&lt;br /&gt;
&lt;br /&gt;
In principe wordt voor het Arduino platform gebruik gemaakt van de programmeertaal C++. Dit is de taal C, uitgebreid met object orientatie. Het is niet nodig om dit nu al te beheersen, maar voor extra informatie moet je dus zoeken op C en C++.&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
Het Arduino project is begonnen in Italie waar een klein team een eenvoudig standaard bordje maakte voor een ATMEL ''microcontroller'' chip. Een microcontroller is eigenlijk een klein computertje met een klein beetje geheugen aan boord en vooral met technisch handige aansluitingen waarmee signalen kunnen worden ingelezen en apparaten bestuurd kunnen worden. Het mooie van Arduino is dat het zo ontworpen is dat niet alleen dit aansluiten erg gemakkelijk is gemaakt, maar ook het programmeren van het bordje. Het echte werk wordt vervolgens gedaan door de microcontroller chip, die dus ontworpen is door ATMEL. Arduino staat overigens niet op zichzelf; er zijn andere projecten, sommigen ouder, die vergelijkbare platformpjes hebben ontwikkeld, zoals [[https://en.wikipedia.org/wiki/Wiring_(development_platform) Wiring]] en [[https://en.wikipedia.org/wiki/Fritzing Fritzing]]. Tussen de oorspronkelijke vrienden die Arduino zijn begonnen boterd het overigens niet meer; het blijkt dat een van de teamleden er met het geld vandoor is gegaan. &lt;br /&gt;
&lt;br /&gt;
Het hele Arduino project is open source wat erop neer komt dat niet alleen de hardware ontwerpen, maar ook de code van de Arduino ontwikkelomgeving software openbaar zijn en ook door anderen gebruikt mogen worden. Dat wordt dan ook veelvuldig gedaan.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Arduino_team_2.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|Vanaf links: Gianluca Martino, David Mellis, David Cuartielles, Tom Igoe en Massimo Banzi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Projecten==&lt;br /&gt;
===[[Arduino - LED blinking|Project 1: Kickstart]]===&lt;br /&gt;
* Installeren van de Arduino software&lt;br /&gt;
* Aansluiten van de Arduino op de PC&lt;br /&gt;
* Een (eenvoudig) programma maken, uploaden en op de Arduino laten werken&lt;br /&gt;
* De Arduino werkt nu ook zelfstandig!&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Verkeerslicht|Project 2: Verkeerslicht]]===&lt;br /&gt;
* Iets meer programmeren&lt;br /&gt;
* De delay() functie&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Communiceren met de PC|Project 3: Communiceren met de PC]]===&lt;br /&gt;
* Introductie van het '''Serial''' object&lt;br /&gt;
* Gebruik van de '''Serial monitor'''&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - LED looplicht|Project 4: LED looplicht]]===&lt;br /&gt;
* Meer programmeren&lt;br /&gt;
* Seriele communicatie helpt bij debugging&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - LED reageert op knopje|Project 5: LED reageert op knopje]]===&lt;br /&gt;
* Aansluiten knopje&lt;br /&gt;
* Pin configureren voor digitale input&lt;br /&gt;
* Stand van knopje uitlezen&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Active Buzzer (met knop)|Project 6: Active Buzzer (met knop)]]===&lt;br /&gt;
* Een buzzer in plaats van een LED!&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - PWM|Project 7: PWM]]===&lt;br /&gt;
* Hoe, wat en waarom van PWM&lt;br /&gt;
* LED dimmer&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - RGB LED|Project 8: RGB LED]]===&lt;br /&gt;
* Meerdere kleuren maken&lt;br /&gt;
* HSL licht model&lt;br /&gt;
* Gebruik van een functie binnen de software&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Passive buzzer|Project 9: Passive buzzer]]===&lt;br /&gt;
* Programmeren van loops&lt;br /&gt;
* tone() functie&lt;br /&gt;
* Commando's vanaf de PC sturen&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Het 1602 LCD Display|Project 10: Het 1602 LCD Display]]===&lt;br /&gt;
* Tekst uitvoeren naar een LCD display&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Analog Value Reading|Project 11: Analog Value Reading]]===&lt;br /&gt;
* Gebruik van analoge ingangen&lt;br /&gt;
* Automatische AD-Conversie&lt;br /&gt;
* Gemeten signaal omzetten naar spanning&lt;br /&gt;
* LET OP &amp;lt;span style=&amp;quot;color:#0055ff&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; en &amp;lt;span style=&amp;quot;color:#0055ff&amp;quot;&amp;gt;float&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Allerlei sensoren|Project 12: Allerlei sensoren]]===&lt;br /&gt;
* Licht meten met een LDR&lt;br /&gt;
* Vlammen detecteren met een IR flame sensor&lt;br /&gt;
* Temperatuur meten met een NTC/Thermistor&lt;br /&gt;
* Temperatuur meten met een LM35 temperature sensor&lt;br /&gt;
* Gas sensor&lt;br /&gt;
* Luchtdruk sensor&lt;br /&gt;
* Water flow sensor&lt;br /&gt;
* Temperatuur meten met een Pt100&lt;br /&gt;
* Luchtvochtigheidssensor (en temperatuur sensor)&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - 1-digit LED Segment Display|Project 13: 1-digit LED Segment Display]]===&lt;br /&gt;
* Aansturen van een LED display; tonen van een cijfer&lt;br /&gt;
* Gebruik van patronen&lt;br /&gt;
* Gebruik van array's&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - 4-digit LED Segment Display|Project 14: 4-digit LED Segment Display]]===&lt;br /&gt;
* Eigenschappen van een Segmented LED display&lt;br /&gt;
* Tonen van meerdere cijfers, onzichtbaar snel achter elkaar&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Temperatuur meten met een DS18B20 sensor|Project 15: Temperatuur meten met de digitale DS18B20 sensor]]===&lt;br /&gt;
* Digitale meting met 1-wire communicatie&lt;br /&gt;
* Meerdere sensoren koppelen&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een digitale clock|Project 16: Een digitale clock]]===&lt;br /&gt;
* De actuele datum / tijd instellen en uitlezen met een clock module&lt;br /&gt;
* Communicatie met I2C met behulp van de Wire.h library&lt;br /&gt;
* Met het display van project 11 maakt het een clock&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Infrarood afstandbediening|Project 17: Infrarood afstandbediening]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een joystick|Project 18: Een joystick]]===&lt;br /&gt;
* Leuk invoer apparaat!&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een servo|Project 19: Een servo]]===&lt;br /&gt;
* Bestuur hem met de joystick&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - De stappenmotor|Project 20: De stappenmotor]]===&lt;br /&gt;
* Hoe wat en waarom van een stappenmotor&lt;br /&gt;
* Besturen met een sensor&lt;br /&gt;
* Besturen met de joystick&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - PIR bewegingsmelder|Project 21: De PIR bewegingsmelder]]===&lt;br /&gt;
* Gebruik en opties van de PIR bewegingsmelde&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een tilt sensor|Project 22: Een tilt sensor]]===&lt;br /&gt;
* Meting van het Ja/Nee type&lt;br /&gt;
* Wachttijden, dempen met weerstand/condensator&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een 3 assige versnellingsmeter (ADXL345)|Project 23: Een 3 assige versnellingsmeter (ADXL345)]]===&lt;br /&gt;
* Meerdimensionale digitale sensor&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Shift Register 74HC595|Project 24: Minder output pins nodig met een shift register]]===&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Een 8x8 RGB LED Matrix aansturen|Project 25: Een 8x8 RGB LED Matrix aansturen]]===&lt;br /&gt;
* Probleem van te veel outputs oplossen met een driver&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - WS2812 Neopixels aansturen|Project 26: Werken met NeoPixels (WS2812)]]===&lt;br /&gt;
* Introductie in NeoPixels&lt;br /&gt;
&lt;br /&gt;
===[[Arduino - GPS ontvanger|Project 27: GPS ontvanger]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Motor met Power|Project 28: Dingen aansturen met meer power / DC Motor]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
===[[Arduino - Micro-SDkaart|Project 29: Gebruik micro SDcard / gegevens opslaan]]===&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* LED Driver&lt;br /&gt;
* Weergave op een TFT/LCD schermpje&lt;br /&gt;
* Lichtnet bedienen met een relais&lt;br /&gt;
* Lichtnet (230V AC) uitlezen (aan/uit)&lt;br /&gt;
* Zonnepaneel (doormeten en gebruiken - ook als lichtsensor te gebruiken) &lt;br /&gt;
* RFID module&lt;br /&gt;
* Ultrasonic (distance) sensor HC-SR04 &lt;br /&gt;
&lt;br /&gt;
* Demultiplexer 74154&lt;br /&gt;
* OpAmp&lt;br /&gt;
* Interrupt afhandeling (externe interrupts/timer interrupts)&lt;br /&gt;
* Arduino's praten met elkaar&lt;br /&gt;
* De Arduino via seriele poort laten praten met een (Delphi) programma op de PC/laptop&lt;br /&gt;
* ZigBee en Philips Hue&lt;br /&gt;
* Laag energieverbruik / lange batterijduur&lt;br /&gt;
* Camera&lt;br /&gt;
&lt;br /&gt;
==More then Arduino==&lt;br /&gt;
===LED driver LM3914===&lt;br /&gt;
===NodeMCU / ESP8266===&lt;br /&gt;
===Instrumentele versterker: OpAmp===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Elektronica]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=154</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=154"/>
				<updated>2018-02-04T22:55:04Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* 28BYJ-48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf of zes draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Dit stappenmotortje is vrij populair, vooral vanwege zijn lage prijs: minder dan €5 (en dat is dan inclusief driver module). Hoewel het vaak prima motortjes zijn moet je wel een beetje oppassen. Ondanks dat ze steevast worden aangeduidt met hetzelfde typenummer ''28BYJ-48'' en je van buiten weinig verschil zult zien, gaat het in dit geval bepaald niet steeds om hetzelfde ding. Er bestaan versies met behoorlijk afwijkende specificaties. De meeste versies zijn voor 5 Volt, maar sommige lopen op 12 Volt. Er zijn, ook voor een gegeven voltage, verschillen in de weerstand van de spoelen en dus in stroomverbruik en kracht. Daarnaast zijn er grote verschillen en de ingebouwde tandwielvertraging. Hoewel de versies sterk op elkaar lijken hebben sommige meer dan 4000 stappen per rotatie, terwijl andere slechts 32 stappen per rotatie vragen. Gegevens op Internet zijn erg onbetrouwbaar. Vaak kun je in tabellen vinden dat de 12 Volt versie evenveel torque (kracht) geeft als een 5 Volt versie, terwijl dat erg onwaarschijnlijk is. [https://grahamwideman.wikispaces.com/Motors-+28BYJ-48+Stepper+motor+notes Hier] een uitgebried rapport van iemand die het e.e.a. heeft proberen na te gaan. Boodschap: onderzoek je eigen motor en vertrouw niet blindelings op de specs.&lt;br /&gt;
&lt;br /&gt;
Wat alle types wel gemeen hebben is dat het gaat om een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Liefst gebruik je hierbij voor de stappenmotor ook een externe voeding (bijvoorbeeld van een powerbank). Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is (meestal!) bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt (maar er zijn dus ook versies met hetzelfde typenummer, die tot 12 Volt gaan).&lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een afstand van een meter van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Stepper.h&amp;gt;&lt;br /&gt;
#define STEPS 4076&lt;br /&gt;
Stepper myStepper(STEPS, 8, 9, 10, 11);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  myStepper.setSpeed(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  myStepper.step(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=153</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=153"/>
				<updated>2018-02-04T22:17:13Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Werking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf of zes draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een afstand van een meter van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Stepper.h&amp;gt;&lt;br /&gt;
#define STEPS 4076&lt;br /&gt;
Stepper myStepper(STEPS, 8, 9, 10, 11);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  myStepper.setSpeed(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  myStepper.step(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=152</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=152"/>
				<updated>2018-02-04T17:27:02Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* 28BYJ-48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een afstand van een meter van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Stepper.h&amp;gt;&lt;br /&gt;
#define STEPS 4076&lt;br /&gt;
Stepper myStepper(STEPS, 8, 9, 10, 11);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  myStepper.setSpeed(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  myStepper.step(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=151</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=151"/>
				<updated>2018-02-04T17:26:26Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* Het programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een meter afstand van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Stepper.h&amp;gt;&lt;br /&gt;
#define STEPS 4076&lt;br /&gt;
Stepper myStepper(STEPS, 8, 9, 10, 11);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  myStepper.setSpeed(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  myStepper.step(10);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=150</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=150"/>
				<updated>2018-02-04T17:05:40Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* De schakeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een meter afstand van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48_schakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Aansluiten 28BYJ-48 met ULN2003&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hier de broncode van het programma &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=File:28byj-48_schakeling.png&amp;diff=149</id>
		<title>File:28byj-48 schakeling.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=File:28byj-48_schakeling.png&amp;diff=149"/>
				<updated>2018-02-04T17:05:33Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=148</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=148"/>
				<updated>2018-02-04T16:53:51Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* De schakeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28byj-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een meter afstand van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hier de broncode van het programma &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=147</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=147"/>
				<updated>2018-02-04T16:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* De schakeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:28BYJ-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een meter afstand van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hier de broncode van het programma &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	<entry>
		<id>http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=146</id>
		<title>Arduino - De stappenmotor</title>
		<link rel="alternate" type="text/html" href="http://wiki.spad-it.nl/index.php?title=Arduino_-_De_stappenmotor&amp;diff=146"/>
				<updated>2018-02-04T16:52:26Z</updated>
		
		<summary type="html">&lt;p&gt;WikiAdmin: /* De schakeling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een stappenmotor is precies wat de naam suggereert: een motor die niet gewoon toeren maakt, maar stapjes zet. Elk stapje wordt afzonderlijk aangestuurd en de motor kan ook weer stapjes terug doen. Door snel achter elkaar, met hoge frequentie, veel stapjes te zetten kan een stappenmotor toch toeren maken, maar daarin blinken ze niet uit en dat is ook niet primair de bedoeling van stappenmotoren. In plaats daarvan zijn ze heel goed in het maken van een precies aantal stappen, bijvoorbeeld om iets in een bepaalde positie te brengen. Een voorbeeld is de printkop van een printer. Ook kun je met enig prutswerk een servo vaak vervangen door een stappenmotor. Maar terwijl een servo beperkt is tot een deel van 360 graden, kunnen stappenmotoren zonder probleem vele slagen maken. Daarbij meet een servo steeds de positie, terwijl een stappenmotor niet beschikt over een positiemeting. Je moet er dus vanuit gaan dat het aantal gezette stappen klopt. Als die stappen te snel komen wordt er wel eens een telfoutje gemaakt en dan is er geen vanzelfsprekende correctie. En als de stroom uitvalt heb je helemaal geen idee meer wat de positie is van het ding dat door de stappenmotor wordt aangestuurd. Daarom hebben systemen met stappenmotoren doorgaans een ingebouwd ijkpunt. Zo kun je de motor terugdraaien totdat iets een positie-signaal afgeeft, bijvoorbeeld doordat een uitsteeksel tegen een knopje aankomt. Dat kan dan het beginpunt zijn vanaf waar je begint met tellen. Afgezien daarvan kun je er doorgaans op vertrouwen dat de aansturing zodanig is dat er geen telfouten optreden. Een stappenmotor is dan een prachtig stuk techniek waarmee posities nauwkeurig kunnen worden ingesteld zonder terugkoppeling door middel van een meting.&lt;br /&gt;
&lt;br /&gt;
===Werking===&lt;br /&gt;
Het voert te ver voor hier om de werking van een [https://nl.wikipedia.org/wiki/Elektromotor elektromotor] uit te leggen, maar het basisprincipe is dat een elektromagneet een andere magneet (vaak een permanente magneet) afwisselend aantrekt en afstoot. Een elektromagneet bestaat uit een draad die om een kern is gewikkeld (een spoel). De richting van het magneetveld wordt bepaald door de stroomrichting en de sterkte van het veld door de stroomsterkte. Een stappenmotor is precies zo'n type elektromotor met permanente magneten en elektromagneten. Het verschil zit in de aansturing waarbij de elektromagneten zo geschakeld worden dat ze de dichtstbijzijnde permanente magneet aantrekken of juist afstoten. Met een slim uitgedachte opzet van permanente magneten en spoelen kan een stappenmotor een stapje maken door de juiste spoel in de juiste stroomrichting te bekrachtigen. Zo'n stapje komt dan overeen met een bepaalde draaihoek die afhankelijk is van de opzet van de stappenmotor.&lt;br /&gt;
&lt;br /&gt;
In het huis van sommige stappenmotoren zit ook een tandwielhuis dat voor extra vertraging zorgt en dus voor meer kracht, maar ook voor meer stappen per rotatie (en dus meer precisie). Daarbij kunnen stappenmotoren hun positie bevriezen en een extra tandwielvertraging vergemakkelijkt deze eigenschap.&lt;br /&gt;
&lt;br /&gt;
Er zijn twee soorten stappenmotoren. De bipolaire stappenmotoren hebben spoelen waar de stroom in de ene of in de andere richting doorheen gaat. Omdat de stroomrichting door die spoelen dus moet kunnen omkeren heet dit type bipolair. Het andere, minder voorkomende type, heeft voor elke stroomrichting eigen spoelen. De stroom door elk van deze spoelen loopt altijd in dezelfde richting zodat dit type wordt aangeduid als unipolaire stappenmotoren. &lt;br /&gt;
&lt;br /&gt;
Bipolaire stappenmotoren hebben twee groepen spoelen, terwijl unipolaire stappenmotoren vier groepen spoelen hebben. Spoelen van een groep worden tegelijk en op dezelfde wijze aangestuurd. Bij bipiolaire stappenmotoren zijn er drie mogelijkheden: een positieve stroom, een negatieve stroom, of natuurlijk geen stroom. Voor unipolaire stappenmotoren zijn er maar twee: stroom of geen stroom - de stroomrichting wordt niet omgedraaid. Daarentegen hebben die dus twee keer zoveel spoel-groepen. Twee groepen spoelen betekent dat een bipolaire stappenmotor vier aansluitdraden heeft: twee voor elke groep spoelen. Een unipolaire stappenmotor, met vier groepen spoelen, heeft vijf aansluitdraden omdat alle spoelen aan een kant aan een gemeenschappelijke draad zitten. Als je ooit ergens een motor vindt (of uit sloopt) kun je aan het aantal aansluitdraden meestal zien wat voor soort motor het is:&lt;br /&gt;
* twee dragen: normale elektromotor&lt;br /&gt;
* vier draden: bipolaire stappenmotor &lt;br /&gt;
* vijf draden: unipolaire stappenmotor&lt;br /&gt;
Door de juiste afwisseling van aansturing kan de stappenmotor stapje voor stapje zetten: de spoelen trekken het anker van de motor dwingend in een bepaalde richting. Als dit met hoge frequentie gebeurt kan de motor zelfs behoorlijk wat toeren maken. Het aansturen van unipolaire stappenmotoren komt erop neer dat de spoelen in de juiste volgorde bekrachtigd moeten worden. Dat is een betrekkelijk eenvoudig klusje voor een Arduino. Maar voor bipolaire stappenmotoren moet dus de stroom''richting'' worden omgedraaid. Dat kan een Arduino niet. Daarvoor moet gebruik worden gemaakt van een brug-schakeling met vier (elektronische) schakelaars die tegelijk omschakelen. Dit is aanzienlijk lastiger maar met de moderne elektronica toch goed uit te voeren. Daarom raakt de unipolaire stappenmotor - die duurder is aan spoelen - langzaamaan in onbruik.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[File:Brugschakeling.png]]&lt;br /&gt;
|-&lt;br /&gt;
|Spoel in brugschakeling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Voor de aansturing van een bipolaire stappenmotor worden drivers gebruikt die voor weinig geld te koop zijn. Een bijkomend voordeel van zo'n driver is dat hij tevens veel meer stroom kan leveren dan met rechtstreekse aansluiting op de Arduino mogelijk zou zijn (&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;40mA). Ook unipolaire stappenmotoren kunnen beter via een (ander soort) driver worden aangesloten. Dankzij deze drivers kunnen we stappenmotoren gebruiken die behoorlijk wat sterker kunnen zijn dan de mini-motortjes in de servo's van een eerder project. Een ander voordeel is drivers de Arduino beschermen tegen piekspanningen die de spoelen van de motor kunnen geven. Spoelen verzetten zich namelijk tegen verandering van de stroom door de spoel en genereren een tegen-spanning bij het (snel) afsluiten van de stroom. Die piekspanning kan zo hoog zijn dat het gevoelige elektronica beschadigt.&lt;br /&gt;
&lt;br /&gt;
===De schakeling===&lt;br /&gt;
&lt;br /&gt;
Extra benodigdheden:&lt;br /&gt;
*1 stappenmotor ([http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/ 28BYJ-48] - unipolaire stappenmotor)&lt;br /&gt;
*1 stappenmotor driver module (ULN2003)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Bestand:28BYJ-48.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|De 28BYJ-48 unipolaire stappenmotor met driver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====28BYJ-48====&lt;br /&gt;
Zoals gezegd is dit een unipolaire stappenmotor met vijf aansluitdraden. Om de Arduino te beschermen en ook om meer stroom te kunnen leveren wordt hij aangesloten via een driver module met de ULN2003 chip als basis. Die driver module laat met LEDjes vaak zien welke spoel-groepen bekrachtigd zijn en welke niet. De motor heeft een vertragingshuis met tandwielen (de as zit niet in het midden - dan moet er wel iets tussen zitten). De vertraging hiervan is bijna 1:64 (preciezer: 1:63.68395). Hij kan zo'n 15 toeren per minuut maken en levert, vanwege de ingebouwde vertraging, een behoorlijke kracht. Omdat we een Arduino gebruiken zal hij meestal draaien op 5 Volt, maar er zijn ook versies, met hetzelfde nummer, die tot 12 Volt gaan. &lt;br /&gt;
&lt;br /&gt;
Voor een motor is ook de kracht die hij kan leveren een belangrijk gegeven. De 28BYJ-48 levert volgens specificatie een moment-kracht van zo'n 30 mN∙m (milli Newton-meter). Dit betekent dat het een kracht levert van 30 milli Newton op een meter afstand van de as. Op 1 cm afstand is die kracht dan 100x groter: 3 Newton, ofwel ongeveer 300 gram. De kracht wordt dus groter naarmate de afstand kleiner wordt. De gegeven kracht hangt overigens wel af van de frequentie waarmee de motor wordt aangestuurd en de voedingsspanning die wordt gebruikt. Als je teveel kracht vraagt, zal de motor nog wel stappen maken, maar neemt de kans toe dat hij stappen gaat overslaan. Dit geldt ook als je de stappen te snel wilt maken en dus een te grote stap-frequentie gebruikt. &lt;br /&gt;
&lt;br /&gt;
Omdat de ingebouwde motor al 64 stappen nodig heeft om een ronde te maken en de 28BYJ-48 daarnaast een tandwielvertraging heeft van 1:63.68395 zijn er (ongeveer) 4076 stappen nodig voor een hele ronde van de as. Met ''stappen'' bedoelen we hier eigenlijk ''halve stappen''. Bij een hele stap gaat een magneet van het anker van de ene spoel naar de volgende, maar door twee naast elkaar liggende spoelen tegelijk te bekrachtigen, beweegt het anker zich naar een positie tussen de beide spoelen. Dit is geen bijzonderheid, maar wordt juist veel gebruikt voor extra precisie.&lt;br /&gt;
&lt;br /&gt;
===Het programma===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hier de broncode van het programma &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Uitleg===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Beetje spelen===&lt;br /&gt;
Verdiepende opdrachtjes&lt;br /&gt;
&lt;br /&gt;
===Navigatie===&lt;br /&gt;
*[[Arduino - Een servo|Vorige project]]&lt;br /&gt;
*[[Arduino cursus|Cursus overzicht]]&lt;br /&gt;
*[[Arduino - PIR bewegingsmelder|Volgende project]]&lt;/div&gt;</summary>
		<author><name>WikiAdmin</name></author>	</entry>

	</feed>