Simulerade analog/digital omvandlare för RaspberryPi (3 / 3 steg)
Steg 3: Programmet
Funktionen RCtime() gör läsningen av sensorer. Jag försökte skriva det så allmänt som möjligt så det kan lyftas ut och används i andra program. Du kan hitta några gånger där vissa justeringar kommer att behöva göras för kalibrering. Exempel i loop funktion i den här raden "if(toggle) pwmWrite (ledPin, photocellReading * 4);" Jag multiplicera fotocellen läsning av 4. Dina resultat kan variera, jag har två av samma fotoceller och de beter sig annorlunda.
När jag först började arbeta med projektet gjorde jag min första experimentera på en Arduino. När jag hade det fungerar jag överförde det till RaspberryPi och det fungerade inte. Det tog mig lång tid att räkna ut vad som var fel. RaspberryPi är inget hot rod men det är många gånger snabbare än en Arduino. Lösningen blev att lägga till "delay(2)" i funktionen RCtime() för att ge kondensator tid att fullgöra.
Koden för blinkningshastighet använder millis() istället för delay() eftersom hela programmet stannar under en delay(). Med hjälp av millis() programmet håller igång och förändringar är omedelbar. "time" är en global variabel definieras under rubriken program och den innehåller. Det har initierats i funktionen setup(). Observera användningen av tiden, samt växla variabler och millis() funktionen i funktionen loop() för att se hur detta görs.
/***********************************************************************
* Filnamn ResCap.c
* Detta program visar ett sätt att simulera en analog läsa genom att mäta
* den tid det tar för att ladda en kondensator genom ett variabelt motstånd.
* Den använder en fotocell och en force känsliga motstånd men tekniken kommer
* arbeta för att läsa en potentiometer eller någon resistiv sensor.
***********************************************************************/
#include < stdio.h >
#include < stdlib.h >
#include < unistd.h >
#include < wiringPi.h >
int photocellPin = 0; Fotocell och kondensator ansluten till pin noll.
int fsrPin = 2; Force känsliga motstånd och kondensator ansluten till stift två.
int ledPin = 1; Lysdioden är ansluten till pin en.
int växla = 1; På/av delstaten LED.
osignerad länge; Spara tid att ställa in blinkningshastighet.
/***********************************************************************
* RCtime() - funktion, använder en digital pin för att mäta en resistiv sensor
* genom att först urladdning kondensator sedan mäta tiden tar det att
* Ladda kondensatorn genom ett variabelt motstånd. När spänningen
* löneförhöjningar till Vcc/2 stift går hög.
***********************************************************************/
int RCtime (int RCpin)
{
int PinVal = 0; Börja med noll.
pinMode (RCpin, OUTPUT); Ställ in pinkodsskydd åt utgång och dra till låg. (mark)
digitalWrite (RCpin, låg);
Delay(2); Ge tid att låta kondensator ansvarsfrihet.
pinMode (RCpin, indata); Nu ange PIN-koden till en ingång och...
medan (digitalRead(RCpin) == låg)
{/ / Räkna hur lång tid det tar för att stiga upp till hög.
PinVal ++; Steg att hålla reda på tiden.
om (PinVal == 30000)
{
bryta; om vi fick detta långt, motståndet är för höga,
} / / Inga indata till sensor, lämna loopen.
}
PinVal = PinVal/25; Dela av 25 för kalibrering.
om (PinVal > 1023) PinVal = 1023; Cap värdet på 1023.
återvända PinVal; Returnerar noll - 1023.
}
/**************************************************************************
* loop() - funktionen körs i en kontinuerlig slinga tills programmet stoppas.
*
* Mer arbetstryck på force känsliga motståndet gör lysdioden blinkar snabbare.
* Mer ljus på fotocellen gör den lätta dimmer.
**************************************************************************/
void loop(void)
{
int photocellReading = RCtime(photocellPin); Läs fotocell.
int fsrReading = RCtime(fsrPin); Läs kraft känsliga motstånd.
om (millis ()-tid > (fsrReading))
{
Toggle =! växla; Om den stämmer inte växla
tid = millis(); och återställa tiden.
}
IF(Toggle) pwmWrite (ledPin, photocellReading * 4);
annat pwmWrite (ledPin, 0);
printf ("fotocell %d - fsr %d\n", photocellReading, fsrReading); ta bort kommentar för felsökning.
}
/***********************************************************************
* setup() - funktionen drivs av Main () en gång när programmet startar.
***********************************************************************/
void setup(void)
{
wiringPiSetup(); Krävs.
pinMode (ledPin, PWM_OUTPUT);
tid = millis(); Spara tid att ställa in blinkningshastighet.
}
/***********************************************************************
* Main () - krävs
***********************************************************************/
int main(void)
{
Setup();
While(1)
{
loop();
}
}