Rotary encoder, gray code og kontaktprel

Relaterede dokumenter
Rotary encoder, gray code og kontaktprel

Robotbil del 1 (Chassis / hjul / motor / motordriver)

Sous-vide: Mad og elektronik i én skøn forening

Arduino Programmering

Microcontroller, Arduino

Microcontroller, Arduino

TinkerCad - Arduino simulator

Dette korte foredrag er opdelt i 3 dele: 1. ARDUINO i flere versioner, hvad er det? 2. DEMO-video 3. Din fremtidige Oscillator, SI5351A 4.

Bruger manual for SW 3.06

Dansk Mink Papir. Teknisk brugermanual

Programmering C Eksamensprojekt. Lavet af Suayb Köse & Nikolaj Egholk Jakobsen

AVR MP Ingeniørhøjskolen i Århus Michael Kaalund

SPIDER Quick guide. DATO: August 2017 FORHANDLER: WASYS A/S. Langebjergvænget Roskilde

Dansk El-montage manual Portautomatik

GSM SMS Modem MODEL: SA RTU-1 V1.01

Lektion 6 / Analog Arduino

MP3 player med DMX interface.

WEA-Base Brugervejledning til vejetransmitter

Undersøgelse teknologi og resurser: Eleverne skal lære om enkel produktudvikling fra ide til implementering.

Svendeprøve Projekt Tyveri alarm

En Krystalstabil Oscillator til dit næste projekt

Arduino Programmering

Video Projector Controller. Brugermanual

Lyskryds. Thomas Olsson Søren Guldbrand Pedersen. Og der blev lys!

Installationsmanual SuperSail Marine Alarm Marine Alarm Wireless

Oversigts billedet: Statistik siden:

FireBUS PARKERINGSVENTILATION

GT2000 GT2000. Brugervejledning

Journal JTAG: Udarbejde af: Benjamin Grydehøj I samarbejde med PDA Projektgruppen. Elektronikteknologafdelingen på Erhvervsakademi Fyn.

2x50 ETHERNET MODUL. RS485 slave med Ethernet-IP. Gælder for: Program nr.: AUXSLAVE v1 Dokument nr.: 0422md2x50-2v1 Dato:

IAI Quick Start Guide

Example sensors. Accelorometer. Simple kontakter. Lysfølsomme. modstande. RFID reader & tags. Temperaturfølsomme. Flex Sensor.

Arduino kursus lektion 3:

MVT380 Vejledning. Forord. Website: Kontakt: Tillykke med din nye GPS tracker MVT380.

Der er derfor, for at alle kan sende, kun tilladt, at sende intermitterende. Altså korte pakker. ( Dette skal dog verificeres!!)

Hos Podconsultsbutik kan du finde vandpumpen i 3 udgaver, hvilket har betydning for hvordan du samler og forbinder pumpen til din Micro:bit.

MAGNETISK LÆNGDE MÅLESYSTEM

Dekoder type 628. Diagram. Print. Litra.DK

DC-Motor Controller. Brugermanual

Motorline JAG (indbygget limit switch) Dansk brugermanual

Kravspecifikation For. Gruppen

Servicemanual BWT Kontrolboks med SMS version 1.5b

Quick Setup Guide SB168-ES og M7CL Dansk version

MANUAL FANTRONIC 20AMP. TRIAC SLAVEENHED FOR VENTILATION VER:FAN 1.1 SKIOLD GØR EN FORSKEL!

Programmeringseksempel til CX/IPC

Arduinostyret klimaanlæg Afsluttende projekt informationsteknologi B

LV systemet. Ved tryk på drift startes/stoppes stinkskabet. Lysdiode lyser ved drift. Går stinkskabet i lav energitilstand blinker grøn lysdiode.

Start af nyt schematic projekt i Quartus II

TG 8. Indhold: TG8 - Kredsløbsbeskrivelse Gruppemedlemmer: Kim Andersen, Kasper Jensen & Thyge Mikkelsen Dato: Modtaget af: Søren Knudsen

Impac230. Beskrivelse. Egenskaber. Impac 230

Billede. Boksventilator BVB. Generel funktionsbeskrivelse

Gateway MP til Modbus RTU. Alle BELIMO motorer med MP-Bus kan tilsluttes til MP-siden af UK24MOD. Interface MP / Modbus RTU

Programmeringseksempel tl BCxxxx (Seriel)

BAS 914S/929S Datablad

SD2DUG24. Dupline bus masterkanalgenerator. Fordele. Beskrivelse

CANSAT & ARDUINO step by step

SunFlux Varenr.: 03104

Stokerbot 1.0. Bruger vejledning. Denne vejledning er stadig i et meget tidligt stadie, og mange ting er ikke forklaret grundigt nok.

QUICKVEJLEDNING til multiguard DIN6. Montering

Installationsmanual SuperSail Marine Alarm Marine Alarm Wireless

Simulering af en Mux2

Instruktion. MINIGAM+ On/off og analog styring IN217DKA

Quick Setup Guide SB168-ES og LS9 Dansk version

SSI-9001 IP65. Installations vejledning. SSIHuset v/svane Electronic ApS. GSM fjern kontrol og alarm system

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

loftdåser. D v a r d e n

SuSix TURBIDITET- OG TØRSTOFTRANSMITTER BROCHURE DK 5.10 SUSIX BROCHURE 1401

Enes Kücükavci Roskilde Tekniske Gymnasium Mathias Turac Informationsteknolog B Vejleder: Karl Bjranasson Programmering C

X88S. SMS fjernstyring til sommerhuse

FireBUS BRANDSIKRINGSAUTOMATIK For spjældsikrede og røgventilerede systemer

SPEED-Commander frekvensomformer. Program nr. 04 Software version 5.12c. Synkron Kontrol

Overvågning af punktsug, URANOS LOCAL EXHAUST GUARD

2/3 Akset digital tæller

Adobe Digital Editions

QUICKVEJLEDNING til Piccolo Light

NoteSync vejledning. Leba Innovation A/S

Guide til indbygget PLC Teco 7300 CV frekvensomformere

MCE2040 SERIEL KOMMUNIKATIONSMODUL

ISC2100 kan kommunikere via RS232, RS485, Ethernet og LON, bruge USB enhed og USB host.

CO2 Control Box E-Cab-980

En krystalstabil oscillator til dit næste projekt

Overvågningskamera. ~Af Svend, Valdemar og Frederik~

I/O Extender - installations- og brugervejledning

VentilationAlarm EP1 ES 966

Brugervejledning Side 1

QUICKVEJLEDNING til 9-moduler. Montering

Installationsmanual 4-Device-Control Boks

GSM port styring 400 brugere

Genius laderegulator Monterings og brugervejledning

DOL 100 vand 8I/16I boks

Teknisk information. ( Hvad skal der bruges? ) Porten som Puls : Evt. Solid-Stat relæ Omron (G3R-OA202SZN) Evt. Solid-Stat relæ Omron (G3R-OA202SZN)

Transkript:

Rotary encoder, gray code og kontaktprel En af mine indkøbte dimser fra ebay er en rotary encoder. Det er en dims der kan konvertere roterende bevægelser til digitale signaler. Den jeg har købt har 20 positioner på en omgang og leverer output i to digitale pins der er gray coded. Detekteringen sker mekanisk. Det betyder at det er kontakter der clicker ind og ud når man drejer akslen. En udfordring ved den konstruktion er at mekaniske kontakter laver noget man kalder kontaktprel. Altså at kontakten hopper til og fra når den skifter position. På engelsk kalder man det bounching. Der er forskellige løsninger til at fjerne kontaktprel på engelsk kaldes metoderne under et debouncing. Der er en hel del mellemregninger men jeg lover en (i min optik) lille lækkerbisken nederst. Gray code Gray code er en utroligt simpel men meget effektiv teknik der kan benyttes alle de steder hvor det kan give problemer når mere end ét bit ændrer sig ad gangen. Et eksempel binært 1 øges til 2:

01 -> 10 Lad os nu forestille os at vi læser de 2 bit af to gange. Første gang vi læser er lige før der lægges 1 til 01. Bit 0 læses som 1. Anden gang vi læser er lige efter opdateringen så nu er bit 1 = 1. Når vi samler de to bit får vi 11 og ikke 10 som er den korrekte værdi. Så afhængig af hvornår man læser kan man få tre forskellige værdier hvoraf den ene er helt i skoven: 01, 10 og 11. Nå men hvad kan grey code da gøre ved det? Jo Som nævnt er det smarte at kun ét bit ændrer sig ad gangen: Index bit 1 bit 0 decimal 0 0 0 0 1 0 1 1 2 1 1 3 3 1 0 2 Så i eksemplet fra før så vil man når man går fra 1 -> 2 i stedet få: 01 -> 11 Så læsning før / efter vil give 01 eller 11 uanset timing. Gray code og rotary encoders En anden anvendelse af gray code er ved rotary encoders hvor gray code kan bidrage til at afsløre hvilken retning akslen drejes i. Det kaldes også quadrature encoding. Det er baseret på to bit og mekanisk eller optisk afkodning af en kode-skive der sidder på akslen:

Hvis der placeres to sensorer (A og B) ved den røde firkant og man roterer skiven så kan de sorte og hvide felter oversættes til ettere og nuller. Rotation med uret: A 0 1 1 0 0 1 1 0 0 1 1 B 0 0 1 1 0 0 1 1 0 0 1 Rotation mod uret så får man: A 0 0 1 1 0 0 1 1 0 0 1 B 0 1 1 0 0 1 1 0 0 1 1 Hvis man nærstuderer signalerne kan man se at når det ene eller andet signal ændrer sig så kan man bruge niveauet på den anden til at se hvilken vej der drejes: Med uret: A+!B og A+B og B+A og B+!A Mod uret: A+B og A+!B og B+!A og B+A Så med gray code kan vi med to bit detektere rotation og omdrejningsretning.

Debouncing Debouncing går i al sin enkelthed ud på at eliminere det kontaktprel som alle mekaniske kontakter laver: Her et ikke nærmere specificeret eksempel der illustrerer hvordan kontakten hopper mellem åben og lukket. Udfordringen er at fjerne de falske on/off transitioner uden at forsinke signalet Det er en lidt umulig opgave men den største del af problemet kan løses med et simpelt kredsløb som dette: I al sin enkelthed går det ud på at bruge en kondensator til at forsinke ændringen i signalet indtil det er stabilt. Når switchen er off vil modstanden lade kondensatoren op til forsyningsspændingen. Når kontakten lukker vil kondensatoren hurtigt aflades. Korte hop tilbage til åben position vil oplade kondesatoren lidt mere. Da impedansen til stel er mindre end den til forsyningen vil den hurtigt lande på 0V og blive der når kontakten holder op med at bounce. Forholdet

mellem R og C fortæller noget om hvor lang tid de kan kompensere for prel. Bounce kan tage alt fra under 1 ms til 50 ms for relæer og endnu længere for store kontaktorer. Hvis man designer efter ~5ms er man godt hjulpet med almindelige små kontakter. Tau = R*C. Tau er tiden fra 0 til 63% (link). Dimensionerer man efter 3*Tau er man på ~95%. Så hvis man sætter Tau = 5/3ms; R*C=Tau; så får man med en 10K pull up en kondensator på ~2uF. Så vælg noget i den størrelsesorden. Bare lige inden jeg får en kæmpe sviner Kredsløbet ovenfor er i princippet ikke i orden. Hvis man kortslutter kondensatoren med en switch vil der løbe en meget høj strøm gennem switch og kondensator. Det kan kondensatoren ikke holde til i længden så der burde være en strømbegrænsermodstand i serie med switchen Nu er du advaret og jeg slipper for tæv :-). I praksis i fuskeropstillinger er det fint og velfungerende. Inverteren (trekanten med bolle på udgangen) har et schmitt trigger symbol. Det betyder at der er tale om en speciel logikkreds der kan fungere korrekt når den udsættes for signaler mellem høj og lav. Normalt er logikkredses logik kun veldefineret når deres input ligger mellem Vil (input low) og Vih (input high): Det betyder at mellem 0.8 og 2V ved kredsen ikke hvad den skal gøre og det kan give de mest mærkværdige resultater. En schmitt trigger kreds derimod har en indbygget hysterese.

Det betyder at den vil betragte et input som high når den passerer upper threshold. Det bliver den ved med indtil signalet går under lower threshold : Da vores debounce kredsløb netop benytter sig at at lade det digitale signal være analogt i et stykke tid til der er ro på situationen ja så er en schmitt trigger indgang at foretrække. Arduino (ATmega328) har schmitt triggere på alle inputs og har i øvrigt synchronizers på også for at sikre meta-stabilitet. Ok måske en blog om det senere :-). Der findes et hav af metoder til at løse denne udfordring. Jeg faldt over en helt anden metode som jeg vil beskrive herunder. Så nu til den lovede lækkerbisken

Algoritme til rotation og debounching Jeg er lidt høj på en virkeligt smart løsning til at dekode gray code og samtidig eliminere kontaktprel. Jeg faldt over den på nettet mens jeg faktisk ledte efter noget helt andet :). Metoden er genial fordi den ikke betragter encoderen som to kontakter og forsøger at debounche dem hver i sær. I stedet udnytter man den egenskaber som gray code har nemlig at der kun er nogle bestemte kombinationer der er valide. Og det virkelig smukke er at den er utroligt nem at implementere uden at påvirke flowet i koden og ikke kræver interrupts. Der er en vigtig antagelse der ligger til grund for denne metodik Nemlig at der ikke er prel på begge signaler på én gang. Er der bounche på begge kontakter samtidig så er der problemer da vi ikke kan vide hvordan de bouncher i forhold til hinanden. Akslens omdrejningshastighed og hvor lang tid kontakterne bouncher afgør altså om metoden virker. Artiklen er ikke om specifikt den encoder jeg har men er helt identisk i funktion altså mekanisk aflæsning og gray code. Hvis du vil læse originalen (skrevet af Oleg Mazurov) kan du finde den her: link. Jeg skal advare med at sige at der er en fin forklaring bare ikke på hvorfor det virker Jeg har prøvet at forklare det lidt dybere herunder. Grunden til at denne algoritme er så genial er at den kan udføres i sekventiel række uden hensyn til timing og ventetid på at signalerne har stabiliseret sig. Det er en kæmpe fordel når man egentligt bare gerne vil koncentrere sig om funktionaliteten eller ikke vil ofre interrupt-ben og timere på håndteringen. Men først hvis du vil lege med har jeg lavet et library som du kan hente her: Download

Lad os starte med at se på hvad vi kan konkludere hvis vi kigger på alle kombinationer af skift i hhv. A og B signalerne. Det er samme betragtning som ovenfor bare oversat til et univers hvor vi sampler signalerne og detekterer flanker som ændringer fra 0 til 1 og 1 til 0. Jeg benævner for nemheds skyld det nyeste signal for hhv. A og B. De signaler der er målt for et øjeblik siden (sidste måling) kalder jeg A og B. Dvs. A A=00 og =11 betyder uændret og =01 og =10 betyder en hhv. rising og falling flanke. Invalid / no rotation Clock wise counter clock wise A =A; B =B (ingen ændringer) A rise & B low A rise & B high A fall & B high A fall & B low B rise & A high B rise & A low B fall & A low B fall & A high A!=A; B!=B (begge ændret) Dvs. rising / falling flank på enten det ene eller andet signal mens det modsatte er stabilt betyder altså rotation. Er signalerne stabile eller ændrede på begge signaler så er der ingen rotation eller signalerne bouncher. Gul: rising / falling flanke Blå: stable direction position Grøn: med uret Rød: mod uret Lys grå: no change Grå: invalid Oleg Mazurov oversætter dette diagram til et array hvor index er A B AB og outputtet er Q som kan adderes til en tæller for at få den position man har bevæget sig til (-1 er mod uret, 1 er med uret og 0 er invalid/no rotation):

static int8_t enc_states[] {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; = Index et (A B AB) er indrettet så listigt at det er utroligt nemt at udregne AB er A og B værdierne som bit 1 og bit 0. Old_AB er en statisk variabel (altså holder sin værdi mellem kald til funktionen): old_ab <<= 2; //move old AB to A'B' old_ab = AB & 0x03; //insert AB as bit 1-0; old_ab is now A'B'AB Hvis man ikke har AB i samme variabel (det har man ofte kun hvis man læser en port og ikke enkelte pins) så kan man bare skifte linje 2 ud med: old_ab = ((A<<1) (B&0x01))&0x3; Hvis du er sikker på at der ikke er overflødige 1 ere i A og B kan du droppe &0x01 og &0x03. De har kun til formål at beskytte mod støj i signalerne. Det eneste der nu mangler er at returnere Q (enc_states i Oleg Mazurov s terminologi). Det gøres ved at bruge de nederste 4 bit af old_ab (A B AB) som index: return enc_states[ (old_ab & 0x0f) ];

Meeen hvorfor virker det egentligt? Hvis B er low og A hopper op og ned ja så må vi da stadig få fleredetekteringer. Og ja det gør vi faktisk! Det unikke er at uanset hvor mange hop vi når at opdage så vil den sidste flanke sikre at vi ender på det rigtige. Årsagen er at vi tæller op på hver stigende flanke og ned på den faldende. Da usikkerheden er overstået på måske 5 ms vil det næppe være noget brugeren når at opdage hvis man eks. bruger det til at styre en menu eller lignende. Hvis man måler på omdrejningshastighed og retning på en motor eller andet hvor det er kritisk, kan man kompensere med elektrisk debouncing som beskrevet ovenfor. Metoden er dog stadig god fordi der kan afvikles i konstant tid (altså tager lige lang tid at udføre hver gang) og fordi der ikke indgår delays eller avancerede timere og interrupts. Som nævnt skal man bare være sikker på at bounching er ophørt inden man når frem til næste kontakt Praktisk med DHV encoderen Den encoder jeg har er markeret DHV og den har tydelig click-markering af step i rotationen. Da ét step giver en flanke på både A og B giver den viste metode 2 step hver gang. For at undgå det har jeg modificeret listen over lovlige kombinationer af A B AB så ændringer i B ignoreres (ændret til mørkegrå og Q=0): Det betyder at arrayet ændres til: static int8_t enc_states[] {0,0,1,0,0,0,0,-1,-1,0,0,0,0,1,0,0}; =

Og voila kun ét step per trin på encoderen Home automation Jeg tror enhver nørd drømmer om det store sindsygt smarte og fuldt integrerede lysstyring, musik, home automation system. Med alarm, videoovervågning, ventilation, varme, dørlåse og alt hvad man ellers kan komme i tanke om Og ja også jeg. Måske mere end de fleste. I 2006 var jeg med en kammerat, Søren, i gang med at udvikle et home automation system der skulle konkurrere med IHC ved at være bedre egnet til renovering af boliger, og ved at være opbygget decentralt så man kunne komme i gang uden at købe en dyr dims til at styre det hele. Vores første enhed skulle være en dobbelt

m io dn it r l ey t r k s i t d l n e æ gmper loftdåser. D e r v a r d e n c e n t r a lt placeret til at modtage tryk fra afbrydere (der skulle opgraderes med en fjeder) og havde adgang til lamperne der skulle styres. Mock-up og prototyperne på billederne er af dette modul. Vi designede et ret fedt koncept hvor printene fungerede både som køleflader og stik-forbindelser. Vi stoppede da det trådløse IHC-system blev introduceret. Bagefter må vi nok erkende at det var lidt heldigt at vi fik stoppet der med finanskrisen lige om hjørnet kunne vi virkelig have brændt fingrene. Men jeg synes nu stadig at vi havde fat i noget af det rigtige. Især konfiguration af funktionaliteten mener jeg vi havde fat i den lange ende af

Nytårsaften 15-16 blev fejret i gode venners lag Og ja der går altid nørd i den når Steffen og jeg mødes Med tiden har emnerne skiftet lidt Der kommer både lidt teknik og ledelse ind i snakken Meeen Nu er det altså tekniknørderi det gælder. Steffen har i mange år leget med et home automation system baseret på HomeSeer og X10 baserede enheder. X10 er en protokol der oprindeligt blev udviklet til power line kommunikation (altså kommunikation på 230V nettet) men der er nu også defineret en trådløs variant. HomeSeer er en

kommerciel home automation controller. Controlleren er det lim der binder de forskellige sensorer, relæer, lysdæmpere osv. sammen. Steffen havde fundet ud af at der findes en masse sensorer og udgange (og radiomoduler) som er designet til at blive tilsuttet til en Auduino. OG de kan fås på Ebay og AliExpress til nærmest ingen penge (1-2 USD per dims). Der er et system til at kæde dem trådløst sammen der hedder MySensors. Endelig er der også open source alternativer til HomeSeer (som jeg synes er for pebret). Og så var jeg hooked Så jeg brugte nogle timer på ebay i julen. Sørger man for at holde hver ordre under 80 kr incl fragt så er der ingen told og moms på og det kan man sagtens når der på de fleste dele er med fri fragt og koster 0,5-2 USD per styk. Arduino

Det første man skal have styr på er selve Arduino en. Der findes et hav af forskellige modeller. Jeg har valgt at fokusere på Arduino Uno og Arduino Nano begge baseret på Atmel ATmega328 microprocessoren. Uno er fysisk større og har USB-stik on-board og er derfor fin til test og udvikling. Nano er fin til de sensorer der bygges, da den er mindre og kan klemmes ind hvor de nu skal bruges. Arduino er et format som reelt bare dækker over en Atmel ATmega processer hvor det grundlæggende (oscillator og forsyning) ligger på boardet og alle pins er ført ud til pinheaders så det er nemt at slutte andre enheder til. Da placeringen af headerne er standardiseret findes der et hav af shields altså print der bare skal presses ned over moder-printet som giver alverdens funktioner: Display, ekstra hukommelse, real time clock, fugt/tenmperatur sensor og 100 andre. Atmel laver en meget stor familie af nogle ret gode og billige processorer. De starter i ATtiny til et par kroner og op til ATmega til 120 kr. Ved Digikey koster en ATmega328 ca. 8 kr. Hvordan kineserne på ebay så er i stand til at lave en Arduino Uno til ca. 22 kr og en Nano til 10 kr er mig absolut en gåde

Stifterne bag Arduino røg for nogle år siden i totterne på hinanden. Det var noget med at de hver især mente at eje domæne og registrerede varemærker. Så i dag kan Arduino også købes under navnet Genuino Arduino modellerne begge baseret på den samme microcontroller (ATmega328) så de har de samme ben og funktioner. Mange ben kan bruges til flere ting så man har både interrupt inputs, analoge inputs, pwm outputs, capture inputs (kobles til timere) og sikkert mere jeg ikke lige kan komme i tanke om. Der er 15 digitale pins samt 6 analoge inputs der også kan bruges som digitale ind-/udgange. En lidt spøjs ting er at Arduino s benævnelse af benene. Det er lidt forvirrende at de ikke bruger de samme betegnelser som Atmel. Port D (altså D0-7) svarer til ben 0-7 på Arduino. Port B (B0-5) svarer til ben 8-13 på Arduino. Port C (C0-5) svarer til A0-5 på Arduino. Micro en har 2KB ram (der glemmer ved power off), 1KB eeprom (der kan huske også selvom strømmen afbrydes og som er nem at skrive til i applikationen) og 32 KB flash (kode memory). Den kører med en 16MHz clock. Arduino giver faktisk ret meget for pengene. Og kan man ikke være i formatet kan man skifte til Arduino Mega2560 der er baseret på ATmega2560. Den har 16 analoge inputs og 54 digitale i/o. Det kan man hurtigt få lyst til hvis man begynder at sætte display, 2-3 temperatursensorer, relæudgange controller og andet sjov på samme

Udviklingsmiljø (IDE) Der er forskellige udviklingsmiljøer til arduino. Dels de originale fra Arduino som kan hentes på arduino.cc (link) og dels et online miljø på codebender.cc (link). Jeg har leget med begge dele og havde jævnt mange problemer med codebender.cc. Men Steffen bruger det så det må kunne bringes til at makke ret Det fede ved codebender er at der er utroligt nem adgang til alle de andre udvikleres kode og der er et hav af officielle libraries. Jeg har på grund af problemerne valgt miljøet fra arduino.cc. Det skal dog ikke hindre mig i at stjæle med arme og ben fra det kode der ligger på codebender Uanset hviket miljø man vælger er der utroligt mange ting der bare virker out of the box. Ting man som traditionel udvikler selv må klare såsom biblioteker med adgang til hardwaren og håndtering af interrupts etc. Alt det og meget mere er der taget hånd om men som gammel embedded udvikler kræver det altså lidt tilvænning ikke at have indflydelse på alting Et første forsøg Jeg vil rigtigt gerne lægge links til ebay her Meeen ebay linkene har en tendens til at gå tabt kort efter kort tid. Så i stedet vil jeg skrive de nøgleord som man kan bruge til at

søge stumperne efter. Et lille tip til brug af ebay Hvis du vælger Lowest price + P&P så får du alle dem med gratis fragt først i listen. Stumperne i dette indlæg er: arduino nano 328 5v ; arduino ft232rl usb to serial adaptor ; arduino led breakout board ; Male To Female Jumper Wire ; Male To Female Jumper Wire. Efter jeg modtog de første stumper skulle den første prøve stå Nano har ikke indbygget USBadaptor så det første var at slutte USB-serial port til. Det var ret nemt 6 ben lige igennem. Det er her female to female jumper cables kommer i brug. Det er en at klaske ting egnet til applikation men dejligt nem måde sammen på. Ikke den endelige fin til test. Step to var at forbinde lysdioderne. De har et stelben og 6 lysdiodeben. Det passer så fikst at de kan sættes på GND og ben 2-7 der ligger lige ved siden af hinanden.

Mit første eksempel fandt jeg på codebender en simpel LED blink test. Jeg modificerede den lidt så den laver et løbelys på det eksterne lysdiodepanel Hent eksemplet her: Invalid download ID. Voila oppe at køre Logic analyzer Low cost!

Jeg stod for nylig med en udfordring en af mine arduino sensorer holdt op med at virke når jeg kommunikerede med den for hurtigt Min eneste indsigt i kommunikationen var gennem det softwaren gav og det bragte mig ikke videre Interfacet er via SPI som jeg bit-banger dvs. styrer manuelt i stedet for at bruge den indbyggede SPI-controller i ATmega microcontrolleren. Havde jeg ikke været for doven ville jeg være gået i kælderen, havde sat oscilloscopet på og analyseret signalerne på ledningerne. Desværre har jeg kun et 2-kanals scope og det har ingen SPI dekodning indbygget så det ville være møg bøvlet på godt jysk Det rigtige værktøj til en applikation som denne er en logik analysator. Det er et digitalt oscilloscope altså i stedet for at kunne måle analoge spændinger så måler den kun 1 og 0. Det kan gøres meget billigere og de fleste logikanalysatorer har ret mange inputs (kanaler). De fleste har desuden avanceret dekodning af signaler eks. SPI som jeg godt kunne bruge her

Så jeg gik på jagt med den intention at finde noget der ikke koster en million. Det naturlige var at kigge efter en USB-dims så jeg ikke skulle betale for en skærm når den på PC en sådan set virker fint. Det kunne også spare på bordpladsen Med min nylige succes / overforbrug på ebay søgte jeg der og efter nogen søgen opdagede jeg nogle moduler baseret på en Cypres CY7C68013A-56 chip. til GPB 3,5 virkede det ret attraktivt Jeg søgte dog efter software til den og det vist sig at være ret tricky noget med at downloade nogle developer tools fra Cypres hjemmeside. Lød lidt for bøvlet til mit temperament :-). Så jeg ledte videre og endte på en Hobby Components 8 ch / 24 MHZ logic analyzer. Det er et britisk firma der har taget et af cypress modulerne og lagt deres egen firmware i og så bruger det et open source tool der hedder Sigrock Pulseview (link) til analyen på pc. Det tændte jeg på også selvom prisen var hele 9.90.

Da jeg fik den opstod der ca. en halv times total forvirring om drivere. Pulseview ville ikke genkende min logikanalysator Det viste sig at Hobby Components har lavet en opdatering i efteråret og forvirringen skyltes dels at jeg ikke vidste hvilken version jeg havde og dels at jeg ikke tænkte på at tage USB-stikket ud og ind og genstarte Pulseview flere gange. Så hermed viderebragt Sigrok Pulseview Programmet er open source og der er ingen releases (i hvert fald ikke til Windows) så man henter bare det seneste nightly build (link) Når altså driveren først er installeret opdager Pulseview selv logikanalysatoren og tilbyder de 8 kanaler med det samme. Konceptet er ret enkelt.

I det store areal vises de digitale kanaler. På bobbel-knappen kan man tilføje logiske kanaler som er dekodede / fortolkede versioner af de primære logiksignaler. Det er ret nemt at tilføje kanaler og så konfigurere hvilke ben der anvendes til hvad. Man kan tilføje flere samtidig. En af de vigtigste ting ved en logikanalysator er at kunne indstille hvor hurtigt / længe der skal samples OG hvornår sampling skal starte Samplerate og antal samples indstilles i menuen. Helt enkelt samples/sec (Hz) og antal samples. Tiden bliver så samplerate * samples Run knappen sætter det hele i gang. Hvis man ikke gør andet starter sampling med det samme men man kan også definere triggere. Det gøres ved at clicke på et signal og definere hvilke flanker der skal fungere som triggere.

Et praktisk eksempel Nu hvor det virker så lad os lave et praktisk eksempel. Jeg skriver på et blogindlæg om en quadrature encoder til Arduino. Det er en mekanisk encoder som med to ben giver mulighed for at regne ud hvor akslen står. Jeg vil gerne se om jeg misser step når jeg drejer så hurtigt som jeg kan. Og om der er kontaktprel Så jeg modificerer koden til at sende de nederste 4 bit af positionen ud på port D (Arduino pin 8-11). Dem tilslutter jeg på logikanalysatoren ben 1, 3, 5, 7. Ben 4, 6 bliver til A og B på quadrature encoderen. Jeg brugte skruetrækkeren i menuen til at fjerne pin 1, 3, 5, 7 som jeg dekoder i en paralle dekoder. Og så konfigurerede jeg en trigger på A: Som det kan ses tæller den rigtigt :-). Der er en tælling for hver flanke For at se reaktionen ved max hastighed satte jeg sample rate op til 6 MHz og vred akslen så hurtigt som muligt. Og som forventet kunne koden ikke nå at fange dem alle som det kan ses her:

Som det kan ses står tælleren stille på 5 mens signalerne på A og B skifter flere gange. Kan den følge med vil der være ny tællerværdi for hvert skift i enten A eller B. Den blå markering er fra en cursor jeg satte på for at se hvilken tidsramme vi er i. Og det blå område er 18ms bredt. Det sjove er at 2 og 3 er meget korte / hurtige mens 4 og 5 er langsomme. Mit umiddelbare gæt er at koden går i gang med at sende serielle signaler ud på konsollen men det har jeg nu indsigt nok til at kunne arbejde med. Det er denne type indsigt som en logikanalysator kan give. Selvfølgelig havde det været fedt med en der også lige havde 4 analoge kanaler men til prisen (~100 kr incl. fragt) er dette her faktisk helt fantastisk! Nå og nu må jeg hellere få fundet den fejl jeg startede bloggen med