Stap 10: Opstarten van de bovenste boord, communicatie met randapparatuur
1. het aandrijven van de spindel
Aangezien voor deze board we hetzelfde type processor als degene op het basisbord gebruiken, is het deel van de bootloader eenvoudig te integreren. Ik alleen veranderd van voetafdrukken (en de cruciale fout maakte, ik zal later uitleggen):
- DIP40 aan TQFP44 voor de PIC18F4550
- THT tot SMT 1206 voor weerstanden
- THT tot SMT voor de USB-connector
Alles bleef hetzelfde zoals het was in de vorige versie van dit board. De vorige versie had een PIC18F46J50 op en zou niet willen opstarten of, ongeacht de programmeur heb ik geprobeerd - ik dat alleen gelaten, op zijn minst voor nu.
De onderdelen op deze planken zijn:
- 1 x PIC18F4550 microcontroller - doet alle de lezing en alle de verwerking. Het is niet de alleen computationele spier op dit forum, maar het heeft de "moeilijkste"
- 1 x PCF8523 real timerklok en kalender - neemt de last van de tijdwaarneming van de PIC18F4550 van schouder. het heeft zijn eigen kristal oscillator van 32.768 KHz.
- 1 x PCA9683 LED driver - in plaats van de PIC18F4550 bezig met de LED knippert, houden deze kerel neemt opdrachten uit de I²C bus en verandert in een knipperende LEDs.
- 1 x 20MHz kristal oscillator voor de PIC18F4550
- 1 x Vishay IR sensor voor extern beheer over het systeem
- 1 x 32.768KHz kristal oscillator voor de real timerklok
- 2 x knoppen - gebruiker interfacing
- 3 x gebruiker LEDs - gebruiker interfacing
- 16 x display LEDs - voor het tonen van de tijd en iets anders
- n x weerstanden - pull-ups, pull-downs en huidige beperkende onderdelen
- n x condensatoren - ontkoppeling, filteren onderdelen
- 1 x fotodiode - gebruikt voor synchronisatie
2. alvorens verder te gaan, de gebruikelijke controles maken!
Het eerste ding dat moeten we er zeker van is dat de bootloader zit werking schoon en we de code van de toepassing van de gebruiker veilig en zeker uploaden kan. Hiervoor moeten we de dezelfde software en firmware pakket die we voor het basisbord gebruikten. Dezelfde Td3 pin USB aanwezigheid zal detecteren, en zal naar de bootloader of terug. De LED's zijn ook op de dezelfde uitgangen. Controleer als u het apparaat kunt programmeren! Als je dat doet, ben je klaar om te gaan met het schrijven van applicatiecode.
Het lezen van de knoppen en knippert de LED's is het eerste ding dat u moet implementeren in de toepassingscode. Vervolgens zullen het gebruik van de mededeling van de I²C. In een van mijn vorige instructables gaf ik een gedetailleerde beschrijving over de I²C bus, vindt u het weer op te frissen uw geheugen. Gebruik uw eigen functies of degene waarin de bibliotheken - it's to you. I voor een zal ik in het project "Ultrasonic meetlint gebruikt" dezelfde functies gebruiken.
Een belangrijk verschil in dit project is de aanwezigheid van twee slaaf apparaten in plaats van één. Dit betekent niets slecht, in feite - het betekent dat we gonna beter gebruik maken van onze seriële bus met functionaliteit voor meerdere slaven. We moeten twee slaaf adressen, en alle adressen van hun belangrijke interne register te definiëren. Dergelijke belangrijke variabelen zou de items uit de RTC, de hendels van de output van de LED-driver, taakcyclus registers van de LED driver, enz.
3. I²C werken, ga naar de infrarood-interface
De volgende op de lijst zou moeten bepalen de "tekengrootte" voor onze roterende display. U kunt meten RPM een of andere manier, of u kunt bijsnijden de vertraging van de LED sign voorschot met behulp van de afstandsbediening. Dit betekent, dat de infrarood protocol decodering je volgende taak is - kan geen vorm van de tekens zonder dat par werken!
Ik werkte eerst met microcontrollers in het derde jaar van de BSc, ik herinner me dat ik kon niet wachten om te zien wat deze klasse was over. Ik denk dat het eerste serieuze project, ik zag en wist te begrijpen was een infrarood systeem. De ontvanger verzameld van de signalen van de afstandsbediening, en wendde zich tot de PIC. Vervolgens een interrupt service routine de gegevens opgeslagen in een 14-bits register, sommige stukjes waren databits, anderen waren control bits, het belangrijkste was: controlecode voor een koeler over IR DC werd met succes geschreven.
Voordat je naar de volgende stap springt, je hebt om zeker te zijn van één ding: de signalen van uw afstandsbediening maken hun weg door de lucht, via IR ontvanger recht op de pin van uw PIC. Dit kan gemakkelijk worden gemeten met de oscilloscoop. Ik heb een momentopname gemaakt met mijn bereik je laten zien wat ik zie op mijn bord een toets op de afstandsbediening te zien als het overeenkomt met het signaal dat u ziet. Het moet een mooie, gemoduleerde digitaal signaal. Hebt u die op de pin, lees de volgende stap om meer over het protocol en de methoden die u kiezen kunt om te vangen de binnenkomende bits de producten van BvD te ontvangen.
Wat ik hier deed was dit: instellen van een interrupt waarmee op een dalende rand op de uitvoer van de infrarood sensoren wordt geactiveerd dan 300us wachtte en het niveau op de pin opnieuw gecontroleerd. Na dit leverde ik een reeks van 13 metingen, met een vertraging van 1.6ms. Nadat ik alles ingesteld, en het signaal dat kwam uit de afstandsbediening gecontroleerd, moest ik dit tweede timing te 1.78ms wijzigen. Deze tijdsinstellingen zijn opgericht met behulp van de module van het vergelijken van de PIC.
Het gebruik van deze module is zeer eenvoudig: denk aan een time-out, het aantal klokcycli zeggen en zet het in het Vergelijk register. Vervolgens stelt u de timer van de PIC 1 te tellen en geven interrupt op timer register - Vergelijk register wedstrijd. Simpel gezegd, we gonna meten van het niveau in vaste tijdsintervallen, en gebruik de meting om te achterhalen welke knop is ingedrukt. Ik keek op het web voor de knop codes, maar wist te vangen alleen de "P +", "P-", "V +", "V-" knop evenementen. Hoe om te achterhalen van de code voor de rest :)?
Gelukkig hebben wij 16 LEDs om weer te geven van alles wat die we willen, recht? Ik schreef een klein programma naar uitvoer de hexadecimale code die kwam op de infrarood sensor input op het display LEDs, lezen met het blote oog en toegevoegd van macro's om ze gemakkelijker te identificeren:
#define REMOTE_P_PLUS 0x20
#define REMOTE_P_MINUS 0x21
en zo verder. Op deze manier kan ik gebeurtenissen op basis van sleutel-persen op de afstandsbediening zonder te weten alle die funky hexadecimale id's veroorzaken. Als u dit doen kunt, is uw afstandsbediening werkt zoals die u had verwacht!
4. synchronisatie
Uw spindel moet zelf een verwijzing naar een punt, moet u ervoor zorgen dat er sprake is van een signaal dat u vangen bij elke rotatie, kunt zodat u weet wanneer om te activeren van de LED-tekenreeks. Ik wilde dit doen met een Hallsensor, maar later besefte dat het zou gaan gek rond 20 neodymium-magneten - ik iets anders moet.
Een gemakkelijke benadering was om een fotodiode en detecteren van licht afkomstig zijn uit een statische LED. Om niet het beeld wazig in de lucht door het beeldscherm LEDs erover, besloten heb ik om het gebruik van infrarood LED voor deze taak. Ik wist dat ik kocht een fotodiode en sommige infrarood LED's enkele jaren geleden, hopen te maken van enkele tests op hen, ik keek hen omhoog en samen een breadboard test schematisch. De fotodiode kreeg aangesloten op de 5V door middel van een huidige beperkende 4.7K weerstand, het middelpunt heb aangesloten op een interrupt staat pin (RB6). We moeten deze detectie op onderbreken voor het om heel precies te zijn! Ik aangesloten de code behandeling van alle beschreven spullen naar het gedeelte van de afbeelding van deze stap. De puntjes vervangt u de code hebt om te schrijven zodat de juiste patroon wordt uitgestoten door de acht blauwe LED's. Dit deel maakt gebruik van de capaciteit van de interrupt-op-change van PORTB pinnen, een functie die is zeer interessant en zeer nuttig wanneer u kreeg van uw INT0 en INT1 pinnen bezet door de I²C bus.