Stap 5: De code uit te leggen
Waarom het gebruik van de VIPER
Een van de begrippen die veel mensen uitdagende vinden bij het begin van het schrijven van code voor microcontrollers is het beheren van meerdere hardware-gerelateerde taken, schijnbaar allemaal draaien op hetzelfde moment. Ontwerpers zijn bijgevolg gefrustreerd door de moeilijkheden bij de tenuitvoerlegging van dergelijke functionaliteiten in microcontrollers.
Om op te lossen deze pijnen, VIPER ondersteunt alle meest gebruikte high-level functies voor Python zoals modules, klassen, multithreading, callbacks, timers en uitzonderingen, plus enkele aangepaste hardware-gerelateerde functies zoals interrupts, PWM, digitale i/o, enz.
Elke thread in de VIPER is een soort gescheiden en parallelle proces dat wordt zelfstandig uitgevoerd op uw bord. Een draad vereist een functie om te worden uitgevoerd als input voor de definitie. Dezelfde functie kan worden verwezen door verschillende thread geven u de mogelijkheid om zeer beknopt en leesbare code te schrijven. U kunt uw algoritme architectuur uitgaande van parallellisme dat typisch is van hoog niveau ontwerpen met draden. Meer info hier.
Binnen de code
Het script wordt uitgevoerd met behulp van 4 draden die parallel lopen. Één thread wordt gebruikt voor het verwerven en het normaliseren van de analoge signalen verworven door middel van een potentiometer- en de sensor van de nabijheid van een IR. De andere drie draden worden gebruikt om het instantiëren van een generieke blink() functie die zorgt voor twee LEDs op verschillende frequenties en een generieke buzz() functie die zorgt voor een zoemer op verschillende frequentie e lengte van de slaap (een effect te creëren "beat"), berekend op basis van de verworven analoge signalen.
Het script van githubophalen De code heeft een ton van de opmerkingen. Gewoon een paar notities.
- delay() vs. sleep()
In de Arduino/bedrading met behulp van de delay() heeft een bijwerking - de Arduino doet niets voor dat terwijl. Als u twee of meer "acties" uitgevoerd onafhankelijk van elkaar, kunt u niet delay().
In VIPER schorst de sleep() functie de huidige thread voor tijd uitgedrukt in time_units, maar alle andere draden zijn vrij om de uitvoering ervan blijven!
- VIPER ingebouwde functies
VIPER VM breidt Python met ingebouwde functies om de General Purpose Input Output pinnen van de embedded apparaat. Deze functies lijken op degene die gebruikt zijn door Arduino, maar zijn nu nog flexibeler.
analogRead() vs. adc.read()
De functie analogRead() wordt geleverd als een ingebouwde te vergemakkelijken van de overgang van de Arduino/bedrading naar VIPER.
Echter de aangewezen manier om te lezen van een analoge pin in VIPER is:
# importeren het adc-stuurprogramma
importeren van adc
x = adc.read (pin, monsters = 1)
Leest analoge waarden van pin dat een van de Ax pinnen moet. Als monsters is 1 of niet gegeven is, retourneert de integerwaarde lezen van pin. Als monsters groter is dan 1, geeft als resultaat een tupel van gehele getallen van grootte monsters.
analogWrite() vs. pwm.write()
Van de Arduino analogWrite() functie biedt een eenvoudige interface voor de hardware PWM, maar biedt geen enkele controle over frequentie. De functie analogWrite() wordt geleverd als een ingebouwde te vergemakkelijken van de overgang van de Arduino/bedrading naar VIPER. Maar de beste manier gebruik van pwm in VIPER is:
# importeren het pwm-stuurprogramma
importeren van pwm
PWM.write (pin, periode, pulse, time_unit = MILLIS)
De staat van pin wordt periodiek overgeschakeld tussen lage en hoge volgens parameters:
-periode is de duur van een blokgolf pwm
-pulse is de tijd dat de blokgolf pwm in de hoge Braziliaanse blijft
-time_unit is de eenheid van tijd en pols worden uitgedrukt in time_unit