03 november 2015

Tutorial: P-Channel step-up

P-Channel FET step-up

In het volgende plaatje zit een probleem. Wat als we vanuit een standaard controller (die een output heeft van 3,5 tot 5 Volt) een 12 Volts motor aan willen sturen? In de vorige entry is duidelijk gesteld, dat voor een P-Channel FET de VGS negatief moet zijn om te geleiden.
Als de Gate niet op het zelfde niveau als de Source kan worden getrokken, dan blijft de FET dus in geleiding. En aangezien de gate spanning niet hoger kan worden dan 5 Volt; het maximale dat een microcontroller kan afgeven, is de Gate dus nooit op het niveau van de Source te krijgen. De FET blijft dus altijd geleiden!

Dit geldt niet voor een N-Channel FET: daar moet immers VGS positief zijn om te geleiden, en Source ligt hier aan massa (0 Volt).


De oplossing

De oplossing voor dit probleem is het inzetten van een niveau verschuiver in de vorm van een NPN transistor:
Op het moment, dat de Basis van Q1(het 5 Volt PWM-signaal) 0,7 volt hoger wordt dat de Emitter (pijltje), gaat de transistor Q1 geleiden, de spanning op de gate van de FET daalt en de FET gaat geleiden.
Daalt de PWM spanning naar 0 Volt, dan gaat Q1 sperren, de Gate spanning stijgt (naar VDD) en de FET zal weer sperren.

Dus bij een ingangsspanning van +5 tot 0 Volt is het toch mogelijk een Gate spanning te sturen tussen +12 (=VDD) en 0 Volt.


Let op!

De negatieve zijde van alle accu's of voedingen moeten aan elkaar verknoopt worden. De positieve niet!!!


Dit verklaart, waarom Q5 en Q6 in het H-brug ontwerp zitten; IC2 wordt gevoed met 5 Volt, en kan dus geen uitgangsspanning van 12 Volt leveren. IC1 kan wel een voldoende spanning leveren; 5 volt is voldoende on Q1 en Q2 open te sturen en 0 Volt voldoende om die weer te laten sperren.

Achtergrond: N-Channel en P-Channel FET

N-Channel FETs en P-Channel FETs als schakelaar

Wanneer geleiden FET's nu eigenlijk, en wat is het verschil?


N-Channel FET

Een N-Channel FET (die met het pijltje naar de Gate plaat toe) geleidt op het moment, dat de spanning tussen Gate en Source positief is. Of te wel: de Gate moet hoger in spanning zijn dan de Source.
In dit plaatje ligt Source aan de negatieve kant van de batterij en de Gate wordt laag gehouden via de weerstand R2 naar de negatieve kant van de batterij. Er is dus geen spanningsverschil tussen Gate en Source (dus: UGS is 0V) De FET zal dus sperren, en de LED is uit.
Als de schakelaar gesloten wordt, dan gaat de Gate spanning omhoog; deze wordt gelijk aan de batterijspanning; de FET zal geleiden, en de LED zal gaan branden. R1 zorgt voor een stroombegrenzing voor de LED; de stroom door een LED mag namelijk niet te groot worden (plm 20mA continue).
Hierboven de schakeling op het prototype deel van de AXE091.
De schakelaar S1 is, via de gele draad, SW3 op het AXE091 bord.

Hier zie je het resultaat als de schakelaar wordt ingedrukt, de gate krijgt spanning, de FET gaat geleiden en de LED brandt (zwak... het is een Monsanto "Special Product" uit 1980 - individueel(!) verpakt; tegenwoordige LEDs zijn efficiënter)


P-Channel FET

Een P-Channel FET (die met het pijltje van de Gate plaat af) geleidt op het moment, dat de spanning tussen Gate en Source negatief is. Of te wel: de Gate moet lager in spanning zijn dan de Source.
In dit plaatje ligt Source aan de positieve kant van de batterij en de Gate wordt hoog gehouden via de weerstand R2 naar de positieve kant van de batterij. Er is dus geen spanningsverschil tussen Gate en Source (dus: UGS is 0V) De FET zal dus sperren, en de LED is uit.
Als de schakelaar gesloten wordt, dan gaat de Gate spanning omlaag naar 0V; de Source blijft op batterijspanning, en dus is de Gate lager in spanning dan de Source: de FET zal geleiden, en de LED zal gaan branden.


Samenvattend

Een N-Channel FET wordt open gestuurd door "positieve" spanning (VG > VS, of te wel: VGS is positief). Een P-Channel FET wordt open gestuurd door een "negatieve" spanning (VG < VS, of te wel: VGS is negatief)

17 oktober 2015

Motoren en H-bruggen - deel 2



Snelheidsregeling

De snelheid waarmee de motor draait, is afhankelijk van de stroom, die erdoorheen loopt. Of liever gezegd, de gemiddelde stroom. Als je de schakelaars snel genoeg open en dicht doen, lijkt de motor gewoon door te draaien in plaats van te starten, te stoppen, enzovoort. Door de verhouding van het "open" en "dicht" te veranderen kunnen we de gemiddelde stroom, en dus de snelheid, regelen.


Pulse Width Modulation

Dit heet Puls Breedte Modulatie. Uiteraard wordt de Engelse term, Pulse Width Modulation, vaker gebruikt, en is de afkorting, PWM, ook in het Nederlands gebruikelijk.


Duty Cycle

In bovenstaand plaatje worden periode en pulsbreedte genoemd. Als de verhouding van pulsbreedte en periode toeneemt, dan neemt ook de (gemiddelde) toegevoerde energie toe. Zo is de gemiddelde waarde laag als de pulsbreedte klein is in vergelijk met de periode.
Deze verhouding heet duty cycle (in correct Nederlands "arbeidscyclus") en wordt gewoonlijk in procenten uitgedrukt.
Zo is bij een duty cycle van 50% de pulsbreedte de helft van van de periode.


Schakelen

De schakelaars uit de vorige entry worden MOSFETs, de elektronische tegenhanger van een schakelaar, die ook nog eens snel schakelt en (relatief) grote stromen kan verwerken. Een H-brug ziet er dan als volgt uit:

Dit is te vereenvoudigen tot onderstaand, waarbij slechts twee stuursignalen gebruikt worden:
Toch is dit geen goede schakeling; een wisselend signaal (PWM!) laat weliswaar de MOSFET snel in geleiding gaan, maar een MOSFET heeft capaciteit; hij zal dus niet snel uit geleiding gaan.
Gedurende een korte periode zullen zowel T3 als T5 geleiden: een volledige kortsluiting!
Dit valt wel te voorkomen, bijvoorbeeld door een comparator in te bouwen (dit is een ontwerp van OddBot, die niet langer actief is op letsmakerobots, but credit's due where credit's due):
De schakeling bestaat uit de LM339, een viervoudige comparator en weerstandsbruggen. Er zijn twee weerstandsbruggen actief; R15/R16/R17 en R13/R14/R5/R6. Voor mij niet bruikbaar, want twee ingangssignalen. Hier worden de low-side zowel als de high-side aangestuurd. Er is nogal wat discussie gaande over dit onderwerp, zie hier (en kijk dan ook even naar YT, hier!)


Low-side, high-side

Ik heb P-channel MOSFETs (IRF9540N) liggen, en N-channel MOSFETs (IRFZ44N). N-channel MOSFETs zitten in de low side, omdat de spanning op de gate hoger moet zijn dan de source om te geleiden.
Bij P-channel MOSFETs is dat andersom: de spanning op de gate moet lager zijn dan de source om te gaan geleiden. Deze zul je dus makkelijker in de high side inzetten.


RDS(ON)

Een ander fenomeen is de weerstand van de Drain-Source overgang bij geleiding, of te wel de RDS(ON). Deze is bij P-channel MOSFETs hoger dan bij N-channel MOSFETs. Heeft iets van doen met de bouwwijze.
Zo heeft de IRFZ44N een RDS(ON) van 0,0175 Ω en de IRF9540N een van 0,117 Ω. Dat is dus ruim zes keer zoveel! Aangezien belasting vooral tijdens het schakelen naar voren komt, is het het beste om de P-channel MOSFET zo min mogelijk te schakelen. Of helemaal niet.


Half bridge

Wat er dan nodig is, is een stuursignaal op de high-side, dat aangeeft welke kant de motor op moet draaien. Of de A-side high side geleidt continue, en de B-side low side wordt gepulst, of de B-side high side geleidt, en de A-side low side wordt gepulst.
Aangezien eigenlijk alleen de onderste helft van de brug (de low side) aangestuurd wordt met een PWM signaal heet dit soort schakeling een half bridge sturing. Er zijn veel half bridge stuur IC's te koop, maar het kan ook met wat simpele logic IC's.

Eisen

Uiteindelijk hebben alle bovenstaande overwegingen geleid tot het volgende lijstje met eisen voor mijn Electronic Speed Controller (ESC):
  • fool proof (dwz onmogelijk kortsluiting te veroorzaken, motor altijd gecontroleerd)
  • efficiënt
  • Drie aansluitingen: Enable, Richting, PWM.
Na lang plussen en minnen is dit het idee:

12 oktober 2015

Motoren en H-bruggen

H-Brug

Om een motor links- of rechtsom te kunnen laten draaien, wordt een H-brug gebruikt. Een H-brug dankt zijn naam aan zijn vorm:
De vier schakelaars zitten in de "poten" van de H, de motor vormt het bruggetje.
Met behulp van de vier schakelaars is het mogelijk om de motor zowel links- als rechtsom te laten draaien. Het rechtsom draaien kan door de schakelaars S1 en S4 te sluiten:
Linksom gaat op eenzelfde manier: sluit S2 en S3 in plaats van S1 en S4:
Uiteraard mogen telkens slechts twee schakelaars tegelijk gesloten worden. Als bijvoorbeeld S1 en S3 (of S2 en S4) tegelijk gesloten zijn, dan is er kortsluiting: de positieve kant van de accu is direct verbonden met de negatieve!


De zijden van de H-brug

A en B kant (A-side, B-side)

Om in gesprekken duidelijk te kunnen maken over welk deel van de H-brug gesproken wordt, heten het linker- en rechterdeel de A-zijde (A-side), respectievelijk de B-zijde (B-side):
Schakelaars S1 en S3 horen dus bij de A-zijde, S2 en S4 horen bij de B-zijde.


Hoge en lage kant (High side, Low side)

Natuurlijk zijn er dan ook horizontaal scheidingen te maken; zo is er een "High side" (dat wat het dichtst bij de voedingsspanning zit) en is er een "Low side"(het deel, dat het dichtst bij de min, of grond (Ground of GND) zit):

De oude doos

Onderstaand schema komt echt wel uit de oude doos. Het is door mij getekend in 1980; de NE544 (IC1) was erg nieuw en ik heb bij Philips de datasheets opgevraagd (en gekregen).
De H-brug is te herkennen als T3, T4, T5 en T6. T1 en T2 zijn driver transistoren (BC549C), terwijl T3...T6 darlingtons zijn (TIP140/145):
En dit was dan het resultaat!

06 oktober 2015

Tutorial 3 - Analoge inputs deel 2

Potentiometer

Het vorige experiment kan in plaats van een LDR natuurlijk ook een potentiometer gebruiken. Elektrisch gezien is er geen verschil, alleen de "bediening" is anders. Bij een LDR zorgt de hoeveelheid licht voor de weerstandswaarde, bij een potmeter de positie van een loper op een weerstandsbaan. Deze positie (en daarmee de weerstandswaarde) wordt middels draaiing of heen- en weer schuiven bereikt. Sluit de gele draad niet langer aan op de "LDR" connector, maar op de "POT". Het programma blijft hetzelfde.


Temperatuur

Het volgende experiment is eenvoudig: het de bedoeling, dat de temperatuur uitgelezen wordt. Verwijder hiervoor de rode en groene draden van het vorige experiment (die van C.0 en C.4 naar de rode en groene LED), en verhuis de gele draad van de uitgangsconnector "LDR" naar "TMP". Zie onder:

Temperatuur uitlezen wordt gedaan middels het readtemp commando. Dit commando leest de temperatuur van een DS18B20 temperatuursensor uit in hele graden Celsius. Er zit zo'n sensor op het AXE091 bordje (op bovenstaande foto: links boven, met de aanduiding DS18B20 links naast het device zelf), maar hij is ook omhuld, met een draad te krijgen:

Vervolgens is het natuurlijk aardig om te weten hoe hoog de temperatuur is. Dit kan met het sertxd commando (sertxd = serial transmit data). In de Programming Editor zit een terminal programma ingebouwd (F8, of PICAXE, Terminal uit het menu). Stel dat in op een Baud Rate van 4800.


Programma

Het programma is al even simpel als de opzet:
; connect C.1 (physical pin 6) to TMP symbol TMP = C.1 ; define pin 6 with the name "TMP" ; set picaxe type #picaxe 08m2 main: readtemp TMP,b0 ; read ADC1 into variable b0 ; if you want a real time feedback of the actual vaules, use ; debug b0 sertxd("Gelezen temperatuur: ", #b0, cr, lf) pause 1000 goto main ; jump back to start

Uitvoer

Deze keer geen video, maar een schermdump van het terminal programma. Hierin is het effect te zien van het aanraken van de DS18B20:
Jawel; ik heb warme vingers ;)

05 oktober 2015

Achtergrond: resolutie of oplossend vermogen.

Resolutie van A/D converter

In de eerste entry over analoge invoer werd in het programma het volgende commentaar gemaakt:
; LDR is documented to read values between 120 and 70; mine works with 190/140. ; of course, 127 should be the tripping point
Hoezo, moet het tripping point "natuurlijk 127 zijn"?
Dat heeft alles te maken met het gebruikte commando. In het programma werd de volgende opdracht gebruikt:
readadc LDR,b0 ; read ADC1 into variable b0
In de documentatie (handboek 2, sectie 2, pagina 170) wordt al gemeld, dat readadc een 8 bits nauwkeurige waarde aflevert in een variabele. Dat deze variabele ook nog eens als BYTE (b0-b27) gedefinieerd is, zegt genoeg. Meer dan 256 mogelijkheden (2 tot de achtste) zijn er niet.


Dat is niet genoeg!

De configuratie van het experimenteerbord is zodanig van opzet, dat de maximale waarde, die door de ADC ingelezen kan worden, gelijkstaat aan de voedingsspanning (zeg: 5 Volt). Dat betekent een resolutie van 5/256 = 0,01953 Volt.
Maar het kan beter! In de PICAXE-08M2 is namelijk een 10 bits ADC aanwezig. Het commando, dat gebruikt oet worden is dan:
readadc10 LDR,w0 ; read ADC1 into variable w0
De gelezen waarde wordt opgeslagen in een WORD type variabele van 16 bits; de waarde kan dan tussen 0 en 65536 liggen, een betekent dan een resolutie van 0,0000763 Volt (afgerond).


Meer van dat

Er zijn meer commando's, die een "hi-res" broertje hebben:
readdac - readdac10 readtemp - readtemp12 ; readtemp = readtemp12, omgezet naar hele graden Celcius. touch - touch16 ; touch = touch16, omgezet naar 8 bits

Achtergrond: Input en output (PICAXE-08M2)

Input en output definiëren

Bij opstarten configureert de PICAXE-08M2 alle pins als input (met uitzondering van pin0/C.0, dat is altijd output). Pas als een commando gegeven wordt, kan de functie wijzigen naar output. In de vorige post werd gesteld:
C0 gaat als output werken, en bestuurt de groene LED (groene draad)
C1 gaat als input werken, en vraagt de LDR uit (gele draad)

Maar hoe regel je dat nu? Het blijkt, dat er drie manieren zijn om dat te voor elkaar te krijgen:
  1. Het juiste type commando gebruiken
  2. Het input of output commando gebruiken
  3. Het let dirs commando gebruiken
Let op: Pins C.0 en C.3 kunnen niet worden gewijzigd, deze zijn altijd output, respectievelijk input.


Het juiste type commando

Zodra er een "input-type" commando gebruikt wordt, configureert de microcontroller de desbetreffende pin als input. Voorbeelden van "input-type" commando's zijn:
  • count C.2, 100, b0
  • pulsin C.5, 1, w1
  • serin C.0, N2400, b3
  • readadc C.1, b0
De PICAXE chips configureren de correcte pin automatisch als input, en dat blijven ze dan ook.

Het zelfde geldt voor "output-type" commando's. Als zo'n commando gebruikt wordt voor een pin, dan wordt deze pin tot output verklaard, en blijft dat ook (als die pin dat aankan, natuurlijk).
Voorbeelden van output commando's zijn
  • high C.4
  • low C.4
  • toggle C.4
  • serout C.2,N2400,("Hello World")
  • sound C.1,(1,40)

Het input/output commando

Gebruik van het input commando definieert een pin expliciet als input. Voorbeeld:
Input C.0
Een beetje overbodig, want direct bij power-up zijn alle pins immers als input geschakeld. Het output commando wordt dan ook vaker gebruikt.


Het let dirs commando

Het "let dirs" commando is bedoeld om alle pins ineens te configureren. Daarvoor wordt een binair masker gebruikt, waarin een 0 een INPUT voorstelt, en een 1 een OUTPUT. Zoals gebruikelijk wordt er van rechts naar links gewerkt (het Most Significant Bit, of MSB, staat links, of "vooraan", het LSB of Least Significant Bit, rechts).
De pins toewijzing voor de PICAXE-08M2 is:
- - - C5 C4 - C2 C1 -
De eerste drie van de 8 bits, C.3 en C.0 zijn nietszeggend, want de 08M2 heeft maar zes I/O pins. En, nogmaals: Pins C.0 en C.3 kunnen niet worden gewijzigd; C.0 is altijd OUT, C.3 is altijd IN
Het commando
let dirsC = %00000110
maakt C.2 en C.1 tot OUTPUTS, en de overige pins tot INPUT. Het procent symbool ("%") aan het begin van de cijferreeks geeft aan dat de volgende cijfers binair moet worden gezien, en niet decimaal.

Het pins commando

In aanvulling op het dirs commando, en om zaken onoverzichtelijker te maken, hier het bit masker voor het pins commqando:
- - - C5 C4 C3 C2 C1 -
Dit omdat pins gebruikt kan worden om samen met een leesmasker te gebruiken in een if...then commando; alle pins zijn dan inputs en C.3 is immers *altijd* input.

03 oktober 2015

Tutorial 2 - Analoge inputs


Analoge inputs

Op het AXE091 bordje zijn een drietal analoge gevers te vinden; een licht afhankelijke weerstand (LDR, van het engelse Light Dependent Resistor) , een regelbare weerstand of potentiometer, en een temperatuurvoeler. Hier zitten ze:

De LDR

Ik moest de LDR nog zelf solderen; hij zat er los bij.

Wat er dient te gebeuren is:
  • Lees de analoge waarde van de LDR digitaal in (readadc commando)
  • Als de waarde boven een gegeven waarde ligt, switch dan de rode LED aan.
  • Als de waarde beneden een gegeven waarde ligt, switch dan de groene LED aan.
  • En zo niet, doe dan beide LEDs uit
Om dat voor elkaar te krijgen, moeten de volgende verbindingen worden gemaakt:
  • C4 gaat als output werken, en bestuurt de rode LED (rode draad)
  • C0 gaat als output werken, en bestuurt de groene LED (groene draad)
  • C1 gaat als input werken, en vraagt de LDR uit (gele draad)
Ziehier de PICAXE-08M2 kant:
De rode draad zit aan pennetje 3, de groene aan pennetje 7 en de gele aan pen 6.
Aan de invoer/uitvoer terminal kant ziet het er zo uit:
De rode draad zit in de L3 connector, de groene in de L1, en de gele in de LDR connector.


Programma

Onderstaand het programma in knip-en-plak mode:
; connect C.4 (physical pin 3) to L1 (red) ; connect C.0 (physical pin 7) to L2 (green) ; connect C.1 (physical pin 6) to LDR ; LDR is documented to read values between 120 and 70; mine works with 190/140. ; of course, 127 should be the tripping point symbol RED = C.4 ; define pin 3 with the name "RED" symbol GREEN = C.0 ; define pin 7 with the name "GREEN" symbol LDR = C.1 ; define pin 6 with the name "LDR" ; set picaxe type #picaxe 08m2 main: readadc LDR,b0 ; read ADC1 into variable b0 ; if you want a real time feedback of the actual vaules, use ; debug b0 if b0 > 157 then RedOn ; if b0 > 157 then do RedOn if b0 < 127 then GreenOn ; if b0 < 127 then do GreenOn low RED ; else switch off RED low GREEN ; and switch off GREEN goto main ; jump back to the start RedOn: ; make a label high RED ; switch on Red LED low GREEN ; switch off Green LED goto main ; jump back to start GreenOn: ; make a label high GREEN ; switch on C.0 low RED ; switch off C.4 goto main ; jump back to start

Let op de introductie van een nieuw element, de subroutine.
Zowel RedOn, als GreenOn zijn subroutines, die vanuit het hoofdprogramma worden opgeroepen. Beide routines keren na aanroep terug naar de hoofdroutine "main" middels het goto main commando.
Er mag maar een main routine zijn (hoewel... de PICs zijn in staat meer dan een taak tegelijk te vervullen: parallel tasking).

Het resultaat: als de LDR wordt afgedekt, daalt de ingelezen waarde onder 127 en wordt de groene LED ontstoken. Onafgedekt valt zoveel licht op de LDR, dat de waarde boven de 157 komt, en de rode LED oplicht:

29 september 2015

Tutorial 1 - Conventies, programmeren en het gebruik van inputs.

Conventies


Conventies; afspraken met betrekking tot de code. Eentje is er al genoemd: het aangeven van het type PIC dat gebruikt wordt. De Programming Editor doet het (ook) zelf, als niets opgegeven is; hij gaat uit van de aangesloten PIC.


Naamgeving

Aangezien de laatste versie Microchip/PICAXE PICs nogal wat mogelijkheden hebben per pootje (zie het referentie plaatje), is het een goede gewoonte om de commando's te gebruiken met een PORT.PIN notatie. In geval van de 08M2 lijkt dat (en is het) een tikkie overdreven, maar de PICAXE-40X2 heeft maar liefst vier poorten (A, B C en D), dus dan is het zo gek niet.
Kortom, het eerste programma wordt dus:
; connect physical pin 3 to L1, L2, or L3 ; set picaxe type #picaxe 08m2 main: high C.4 ; switch pin 3 high pause 1000 ; wait for 1 second low C.4 ; switch pin 3 low pause 1000 ; wait for 1 second goto main


Programmeren

Aan de hand van voorbeelden staan hieronder een paar programmeer principes uitgewerkt. Hopelijk wordt het potentieel van de PICAXE PICs duidelijk. De referentie staat natuurlijk online.


Symbols

Bij het gebruik van PICs met veel pootjes wordt het steeds lastiger om te onthouden welk in- of uitvoer apparaat gekoppeld is aan welk pootje. Dan is het gebruik van symbols makkelijk. Zo kun je de output C.4 in bovenstaand test programma vervangen door het symbol "LED", of "rode_LED", of "lampje".
; connect physical pin 3 to L1, L2, or L3 ; set picaxe type #picaxe 08m2 symbol LED = C.4 ; define LED connected to C.4 main: high LED ; switch on LED wait 1 ; wait for 1 second low LED ; switch LED off wait 1 ; wait for 1 second goto main ; loop forever

In plaats van pause gebruik ik hier wait. Pause telt in milliseconden, wait in hele seconden. Pause accepteert waarden tussen 1 en 65535, wait verwacht input tussen 1 en 65.


Loops

Loops, of lussen, zijn herhalende stukjes programma. Bovenstaand voorbeeld is een programma, dat altijd maar doorgaat, dankzij het "goto main" als laatste commando. Hordes programmeurs zijn tegen goto-commando's, bovendien wordt "goto" niet door alle programmeertalen herkend. Bovendien is een "goto" altijd op te vangen met een andere constructie.
In bovenstaand voorbeeld is het een loop. Daarnaast ga ik een teller gebruiken - nog een toepassing van SYMBOL, maar nu om een variabele te definiëren (LED was een constante):
; connect physical pin 3 to L1, L2, or L3 symbol counter = b1 ; define the variable b1 as "counter" symbol LED = C.4 ; define pin 3 with the name "LED" ; set picaxe type #picaxe 08m2 main: for counter = 1 to 5 ; start a for...next loop high LED ; switch pin 3 high pause 500 ; wait for 0.5 second low LED ; switch pin 3 low pause 500 ; wait for 0.5 second next counter ; end of for...next loop end ‘ end program
Dit programma zal dus de LED vijf keer laten "flashen" en is dan beëindigd. Dat is niet erg spectaculair... als je wilt laten zien wat je kan met zo'n PIC en iemand reageert niet snel genoeg, dan is het alweer voorbij. Je moet de PIC dan opnieuw opstarten, en bij een PICAXE-08M2 betekent dat: spanning eraf en weer opnieuw aansluiten.
Dat kan anders!


Input


Er zitten een aantal schakelaar op het AXE091 prototype bord. Ik ga ervoor zorgen, dat de PIC de LED vijf keer laat flashen nadat de schakelaar ingedrukt is. Om dit voor elkaar te krijgen, sluit ik ingang C.1 (pootje 6) aan op schakelaar SW3. Ingang C.3 (pootje 6) - groene draad. De gele draad is (nog steeds) uitgang C.4 (pootje 3).
Groene draad gaat aan connector met opschrift SW3; de gele is (nog steeds) verbonden met L1:
Het programma wordt vervolgens:
; connect physical pin 3 to L1, L2, or L3 ; connect physical pin 6 to SW1, SW2, or SW3 symbol counter = b1 ; define the variable b1 as "counter" symbol LED = C.4 ; define pin 3 with the name "LED" symbol KEY = pinC.1 ; define pin 6 with the name "KEY" ; set picaxe type #picaxe 08m2 main: ; main loop if KEY = 1 then flash ; 1 means high (Vcc) goto main flash: for counter = 1 to 5 ; start a for...next loop high LED ; switch pin 4 high pause 500 ; wait for 0.5 second low LED ; switch pin 4 low pause 500 ; wait for 0.5 second next counter ; end of for...next loop goto main ; done - wait for next key

En dit is het resltaat:

Wordt vervolgd met analoge input.

28 september 2015

Layout en interfacing

Het bord

Het bord kaal ziet er zo uit:
Wat ik slecht vind is het gebruik van een 9V batterij snap-on, terwijl deze spanning veel te hoog is. Bye-bye board! Niet doen, dus.
Je moet de batterijhouder gebruiken. En dan nog: niet verkeerd aansluiten, dus eerst goed kijken of de connectoren op elkaar passen, en dan pas contact laten maken. Voor zover ik weet zit er geen beveiliging tegen ompolen op!

Details


Voor de vaarregelaar (ook wel: Electronic Speed Controller, of ESC) moet een 08M2 volstaan. Deze werd ook door Alan gebruikt, en ik heb er twee mee laten komen met het bordje.
Hier zit hij op het bord:
Ik ga dus voorlopig alleen deze gebruiken. Om dit duidelijk te maken zal ik in de source code duidelijk maken om welk type microcontroller het gaat. Dat is sowieso een goede gewoonte.
Dit gaat als volgt:
; set picaxe type #picaxe 08m2
Regels, die beginnen met een puntkomma (semi colon, ";") zijn commentaarregels. Je mag ook een apostrof ("'") gebruiken:
'dit is ook commentaar maar dit niet meer!
Een apostrof is, net als een puntkomma, een aanduiding voor één regel commentaar.
Als je meer regels commentaar wilt gebruiken kun je de #rem opdracht gebruiken, samen met #endrem:
#rem dit wordt door de PICAXE Programmer/Editor gezien als een blok commentaar dat doorgaat totdat het endrem directive bereikt wordt: #endrem

Regels, die voorafgegaan worden met zo'n nummer teken (hash, "#"), zijn 'directives', dit zijn geen programmaregels, maar aanwijzingen voor de compiler. Het "#rem" directive, hierboven was dus een aanwijzing voor de compiler, om de volgende regels niet te beschouwen als programmacode, maar te negeren.
Het #picaxe directive is er ook zo een, en deze vertelt de compiler expliciet welke chip er geprogrammeerd gaat worden. Zie handboek 2, pagina 7, Directives.


Input en output


Er zitten nogal wat componenten op het AXE091 bordje. Hier in detail de IO aansluitingen:
Van links naar rechts zitten er de volgende connectoren op:
  • V+ (+ Spanning, Vcc) 
  • 0V (- Spanning, Gnd) 
  • KD Keyboard Data 
  • KC Keyboard Clock 
  • IRR Infra-rood ontvanger [=receiver] 
  • IRL Infra-rood LED
  • L3 LED L3 (rood)
  • L2 LED L2 (geel)
  • L1 LED L1 (groen)
  • SVO Servo
  • LDR Lichtgevoelige weerstand
  • TMP DS18B20 temperatuur sensor
  • SW3 Schakelaar 3
  • SW2 Schakelaar 2
  • SW1 Schakelaar 1
  • POT Potentiometer (regelbare weerstand)
  • V+ (+ Spanning, Vcc)
  • V+ (+ Spanning, Vcc)
  • 0V (- Spanning, Gnd)
  • 0V (- Spanning, Gnd)
Aan de onderkant zitten er nog een aantal, zie de beschrijving van het AXE091 bord.


Troubleshooting het eerste programma


Ik gebruik onderstaand altijd als refentie:
Voor het eerste experiment moeten uitgang C.4, fysieke pin 3, van de PICAXE-08M2 worden verbonden met een van de LED connectoren L1, L2 of L3. Naar gelang of je rood, geel of groen leuk vindt.
Vervolgens sluit je de batterijen en de interface kabel aan. Je hebt de driver natuurlijk al geïnstalleerd. Je opent de Programming Editor, en geeft je eerste programma in (zie ook de eerste kennismaking)
Vervolgens laat je de syntax controleren:
En dan programmeren maar! Oeps:
Deze fout komt nogal eens voor, en stelt weinig voor. Open het Options item in je Programming Editor, en je zult zien dat de USB interface niet op COM1, maar op COM5 zit.
Doodeenvoudig de juiste COM-poort selecteren en nogmaals proberen:
En dit is dan het resultaat:

27 september 2015

Het begin

Intro

Door omstandigheden ben ik (weer) met modelbouw begonnen. Waar ik vroeger snelheidsregelaars bouwde met een NE544 (toen heb ik prototype samples aangevraagd; inmiddels is het IC uit de handel!), kom je er tegenwoordig geen enkele meer tegen, die zonder een PIC werkt.
Ook de eindtrap; die van mij gebruikte de TIP140 en TIP145 complementaire power darlingtons. Tegenwoordig gebruik je een IRF6648, een BUZ11 of iets wat er op lijkt. In elk geval iets, dat bij de 10A, die de TIP140 kon verstouwen geen 30 Watt (VCE(SAT)=3,0V bij ICE=10A, P=U*I) verstookte, maar iets van 3 Watt (RDS(ON)=0,032Ω en P=I^2*R)

Doel: met behulp van een PIC zelf een vaarregelaar bouwen.

Welke chip?

Iets dat ik tegenkwam, waren de pagina's van Alan Bond met een geweldige geluiden generator. Alan gebruikt PIC's afkomstig van een firma PICAXE. Feitelijk zijn het micro controllers van Microchip.
Ze zijn goedkoop (variërend van UKP 1,80 tot UKP 5,90), makkelijk te programmeren, en -last but no least- alle programmatuur is gratis!
En dus vallen Arduino's, ATMega's en Raspberries af - te veel van het goede.

Hard- en Software

Een ogenblik nagedacht over de kit, die ik zou gaan kopen. Besloten om voor de universele AXE091 te gaan - daar kun je elke controller mee programmeren, en je kunt ermee experimenteren.

Features:
  • USB programmeerkabel.
  • PICAXE-18M2 Microcontroller.
  • Ondersteunt alle 8/14/18/20/2840 pin PICAXE chips.
  • Computer download schakeling is on-board.
  • Groot breadboard.
  • Voeding middels batterijen (houder inlcuded) of externe voeding (niet meegeleverd).
  • LED power indicator.
  • 3 LEDs als outputs.
  • 3 schakelaars als input.
  • LDR en potmeter als analoge inputs.
  • DS18B20 digitale temperatuur sensor.
  • Infra rood ontvanger en zender (LED).
  • Keyboard connector.
  • Seriële (MAX202 buffered) RS232 connector (inverted en non-inverted).
  • IC houders voor I2C en SPI geheugen modules (niet meegeleverd).
  • Socket en batterij connector voor een DS1307 Real Time Clock (niet meegeleverd).

De software zou op CD worden geleverd, maar de meest recente versies staan toch online - de CD zat er (dus) ook niet bij.

Eerste controle

Nadat je de driver hebt geïnstalleerd, en je computer ervan overtuigd hebt dat er iets is aangesloten, volgt het eerste programma!
main: high 4 pause 1000 low 4 pause 1000 goto main