Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
2 місяці тому
1 місяць тому
1 місяць тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. # WiringPi-Bibliothek Dokumentation
  2. Die WiringPi-Bibliothek ermöglicht den Zugriff auf die GPIO-Pins des Raspberry Pi. In dieser Dokumentation finden Sie Informationen zu den verfügbaren Funktionen und deren Verwendung.
  3. Seit Version 3 werden nun auch wieder Erweiterungen an der Schnittstelle vorgenommen. Bei Neuimplementierungen sollte man auf die aktuellen bzw. neunen Funktionen setzen, da WiringPi 3 auch auf alten Systemen (ab Kernel 5.10) installiert werden kann.
  4. ACHTUNG: Diese Dokumemtation ist noch in Arbeit und somit unvollständig.
  5. ## Installation
  6. Leider steht die WiringPi Library nicht direkt in Raspberry Pi OS zur Verfügung, darum muss sie manuelle installiert weden.
  7. Entweder man lädt sich ein Debian-Paket herunter oder übersetzt es manuell.
  8. **Debian-Paket erstellen:**
  9. ```bash
  10. sudo apt install git
  11. git clone https://github.com/WiringPi/WiringPi.git
  12. cd WiringPi
  13. ./build debian
  14. mv debian-template/wiringpi-3.0-1.deb .
  15. ```
  16. **Debian-Paket installieren:**
  17. ```bash
  18. sudo apt install ./wiringpi-3.0-1.deb
  19. ```
  20. **Debian-Paket deinstallieren:**
  21. ```bash
  22. sudo apt purge wiringpi
  23. ```
  24. ## Pin-Nummerierung und Raspbery Pi Modelle
  25. GPIOs: https://pinout.xyz/pinout/wiringpi
  26. **Raspberry Pi Modelle mit 40-Pin GPIO J8 Header:**
  27. | BCM | WPI | Name | Physisch | Name | WPI | BCM |
  28. |-----|-----|---------|:---------:|---------|-----|-----|
  29. | | | 3V3 | 1 I 2 | 5V | | |
  30. | 2 | 8 | SDA.1 | 3 I 4 | 5V | | |
  31. | 3 | 9 | SCL.1 | 5 I 6 | GND | | |
  32. | 4 | 7 | GPIO. 7 | 7 I 8 | TxD | 15 | 14 |
  33. | | | GND | 9 I 10 | RxD | 16 | 15 |
  34. | 17 | 0 | GPIO. 0 | 11 I 12 | GPIO. 1 | 1 | 18 |
  35. | 27 | 2 | GPIO. 2 | 13 I 14 | GND | | |
  36. | 22 | 3 | GPIO. 3 | 15 I 16 | GPIO. 4 | 4 | 23 |
  37. | | | 3V3 | 17 I 18 | GPIO. 5 | 5 | 24 |
  38. | 10 | 12 | MOSI | 19 I 20 | GND | | |
  39. | 9 | 13 | MISO | 21 I 22 | GPIO. 6 | 6 | 25 |
  40. | 11 | 14 | SCLK | 23 I 24 | CE0 | 10 | 8 |
  41. | | | GND | 25 I 26 | CE1 | 11 | 7 |
  42. | 0 | 30 | SDA.0 | 27 I 28 | SCL.0 | 31 | 1 |
  43. | 5 | 21 | GPIO.21 | 29 I 30 | GND | | |
  44. | 6 | 22 | GPIO.22 | 31 I 32 | GPIO.26 | 26 | 12 |
  45. | 13 | 23 | GPIO.23 | 33 I 34 | GND | | |
  46. | 19 | 24 | GPIO.24 | 35 I 36 | GPIO.27 | 27 | 16 |
  47. | 26 | 25 | GPIO.25 | 37 I 38 | GPIO.28 | 28 | 20 |
  48. | | | GND | 39 I 40 | GPIO.29 | 29 | 21 |
  49. **Raspberry Pi 1B Rev. 2 mit 26-Pin GPIO P1 Header:**
  50. | BCM | WPI | Name | Physisch | Name | WPI | BCM |
  51. |-----|-----|---------|:--------:|----------|-----|-----|
  52. | | | 3V3 | 1 I 2 | 5V | | |
  53. | 2 | 8 | SDA.1 | 3 I 4 | 5V | | |
  54. | 3 | 9 | SCL.1 | 5 I 6 | GND | | |
  55. | 4 | 7 | GPIO. 7 | 7 I 8 | TxD | 15 | 14 |
  56. | | | GND | 9 I 10 | RxD | 16 | 15 |
  57. | 17 | 0 | GPIO. 0 | 11 I 12 | GPIO. 1 | 1 | 18 |
  58. | 27 | 2 | GPIO. 2 | 13 I 14 | GND | | |
  59. | 22 | 3 | GPIO. 3 | 15 I 16 | GPIO. 4 | 4 | 23 |
  60. | | | 3V3 | 17 I 18 | GPIO. 5 | 5 | 24 |
  61. | 10 | 12 | MOSI | 19 I 20 | GND | | |
  62. | 9 | 13 | MISO | 21 I 22 | GPIO. 6 | 6 | 25 |
  63. | 11 | 14 | SCLK | 23 I 24 | CE0 | 10 | 8 |
  64. | | | GND | 25 I 26 | CE1 | 11 | 7 |
  65. **Raspberry Pi 1B Rev. 1 mit 26-Pin GPIO P1 Header:**
  66. | BCM | WPI | Name | Physisch | Name | WPI | BCM |
  67. |-----|-----|---------|:--------:|---------|-----|-----|
  68. | | | 3V3 | 1 I 2 | 5V | | |
  69. | 0 | 8 | SDA.0 | 3 I 4 | 5V | | |
  70. | 1 | 9 | SCL.0 | 5 I 6 | GND | | |
  71. | 4 | 7 | GPIO. 7 | 7 I 8 | TxD | 15 | 14 |
  72. | | | GND | 9 I 10 | RxD | 16 | 15 |
  73. | 17 | 0 | GPIO. 0 | 11 I 12 | GPIO. 1 | 1 | 18 |
  74. | 21 | 2 | GPIO. 2 | 13 I 14 | GND | | |
  75. | 22 | 3 | GPIO. 3 | 15 I 16 | GPIO. 4 | 4 | 23 |
  76. | | | 3V3 | 17 I 18 | GPIO. 5 | 5 | 24 |
  77. | 10 | 12 | MOSI | 19 I 20 | GND | | |
  78. | 9 | 13 | MISO | 21 I 22 | GPIO. 6 | 6 | 25 |
  79. | 11 | 14 | SCLK | 23 I 24 | CE0 | 10 | 8 |
  80. | | | GND | 25 I 26 | CE1 | 11 | 7 |
  81. **Hinweise**
  82. Beachten Sie die abweichende Pin-Nummern und den I2C0 bei Raspberry Pi 1B Rev. 1!
  83. ## Initialisierung
  84. Am Beginn muss eine Initialisierung der WiringPi Library erfolgen.
  85. Dazu muss eine der folgenden Funktionen aufgerufen werden:
  86. Veraltete Funktionen (nicht mehr verwenden):
  87. ``wiringPiSetup`` verwendet WiringPi-Nummerierung (WPI) der GPIO's und greift direkt auf die GPIO-Register zu.
  88. ``wiringPiSetupGpio`` verwendet BCM-Nummerierung der GPIO's und greift direkt auf die GPIO-Register zu.
  89. ``wiringPiSetupPhys`` verwendet physikalische Pin-Nummerierung der GPIO's und greift direkt auf die GPIO-Register zu.
  90. ``wiringPiSetupSys`` verwendet BCM-Nummerierung und ruft ab Version 3.4 die neue Funktion ``wiringPiSetupGpioDevice`` auf, um die Kompatibilität auch mit neuen Kerneln zu gewährleisten.
  91. In Version 2 wurde noch das virtuelle Dateisystem /sys/class/gpio verwendet. Der Export der GPIO's musste allerdings extern vor der Initialsierung erfolgen! Die Funktion ist veraltet und soll nicht
  92. mehr benutzt werden!
  93. **Ab Version 3.4:**
  94. ``wiringPiSetupPinType`` entscheidet ob nun WiringPi, BCM oder physische Pin-Nummerierung verwendet wird, anhand des Parameters pinType. Es führt also die ersten 3 Setup-Funktionen auf eine zusammen.
  95. ``wiringPiSetupGpioDevice`` ist der Nachfolger der ``wiringPiSetupSys`` Funktion und verwendet nun "GPIO Character Device Userspace API" in Version 1 (ab Kernel 5.10 verfügbar). Nähere Informationen findet man bei https://docs.kernel.org/driver-api/gpio/driver.html. Anhand des Parameters pinType wird wieder entschieden, welche Pin-Nummerierung verwendet wird.
  96. Bei dieser Variante wird nicht direkt auf den GPIO-Speicher (DMA) zugegriffen sondern über eine Kernel Schnittstelle, die mit Benutzerrechten verfügbar ist. Nachteil ist der eingeschrenkte Funktionsumfang und die niedrige Performance.
  97. <!-- Achtung Code der die neunen Funktionen benutzt ist nicht mehr mit der älterer Library Versionen 2 kompatibel! -->
  98. ### wiringPiSetup V2
  99. Inialisierung WiringPi in klassischer Art.
  100. >>>
  101. ```C
  102. int wiringPiSetupGpio(void)
  103. ```
  104. ``Rückgabewert``: Fehlerstatus
  105. > 0 ... kein Fehler
  106. **Beispiel:**
  107. ```C
  108. wiringPiSetupGpio();
  109. ```
  110. ### wiringPiSetup V3
  111. Inialisierung WiringPi.
  112. >>>
  113. ```C
  114. int wiringPiSetupPinType(enum WPIPinType pinType)
  115. ```
  116. ``pinType``: Art der Pin-Nummerierung
  117. - WPI_PIN_BCM ... BCM-Nummerierung
  118. - WPI_PIN_WPI ... WiringPi-Nummerierung
  119. - WPI_PIN_PHYS ... physikalische Nummerierung
  120. ``Rückgabewert``: Fehlerstatus
  121. > 0 ... kein Fehler
  122. > -1 ... Fehler ungültiger Parameter
  123. **Beispiel:**
  124. ```C
  125. wiringPiSetupPinType(WPI_PIN_BCM);
  126. ```
  127. ## Basisfunktionen
  128. ### pinMode
  129. Ändert den Modus eines GPIO-Pins.
  130. >>>
  131. ```C
  132. void pinMode(int pin, int mode)
  133. ```
  134. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  135. ``mode``: Modus.
  136. - INPUT ... Eingang
  137. - OUTPUT ... Ausgang
  138. - PWM_OUTPUT ... PWM Ausgang (Frequenz und Puls-Pause Verhältnis konfigurierbar)
  139. - PWM_MS_OUTPUT ... PWM Ausgang mit Modus MS (Mark/Space) (Ab Version 3)
  140. - PWM_BAL_OUTPUT ... PWM Ausgang mit Modus BAL (Balanced) (Ab Version 3)
  141. - GPIO_CLOCK ... Frequenz Ausgang
  142. - PM_OFF ... Freigabe
  143. **Beispiel:**
  144. ```C
  145. pinMode(17, OUTPUT);
  146. ```
  147. **Support:**
  148. PM_OFF setzt den GPIO zurück (Input) und gibt ihn frei. PWM wird beendet.
  149. Raspberry Pi 5 unterstützt den PWM BAL (Balanced) Modus nicht. Bei PWM_OUTPUT wird der MS Modus aktiviert.
  150. GPIO_CLOCK wird bei Raspberry Pi 5 (RP1) aktuell noch nicht unterstützt.
  151. **PWM Ausgang**
  152. PWM_OUTPUT aktiviert den angegeben PWM Ausgang mit den Einstellungen:
  153. - Modus: BAL-Balanced (Pi0-4), MS-Mark/Space (Pi 5)
  154. - Range: 1024
  155. - Divider: 32
  156. Um sicher zu stellen, dass der Ausgang ohne aktiver Frequenz startet, sollte man vor der Aktivierung ``pwmWrite(PWM_GPIO, 0);`` ausführen.
  157. Danach können die entsprechenden Clock und Range Werte angepasst werden, ohne das bereits ungewollt eine Frequenz ausgegeben wird.
  158. ### pinMode
  159. ### digitalWrite
  160. Setzt den Wert eines GPIO-Pins.
  161. >>>
  162. ```C
  163. void digitalWrite(int pin, int value)
  164. ```
  165. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  166. ``value``: Der logische Wert.
  167. - HIGH ... Wert 1 (elektisch ~3,3 V)
  168. - LOW ... Wert 0 (elektisch ~0 V / GND)
  169. **Beispiel:**
  170. ```C
  171. pinMode(17, OUTPUT);
  172. DigitalWrite(17, HIGH);
  173. ```
  174. ### pullUpDnControl
  175. Ändert den internen Pull-Up/Down Widerstand.
  176. >>>
  177. ```C
  178. void pullUpDnControl (int pin, int pud)
  179. ```
  180. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  181. ``pud``: Der Widerstand.
  182. - PUD_OFF ... Kein Widerstand
  183. - PUD_UP ... Pull-Up Widerstand (~50 kOhm)
  184. - PUD_DOWN ... Pull-Down Widerstand (~50 kOhm)
  185. **Beispiel:**
  186. ```C
  187. pullUpDnControl(17, PUD_DOWN);
  188. ```
  189. ### digitalRead
  190. Liest den Wert eines GPIO-Pins.
  191. >>>
  192. ```C
  193. int digitalRead(int pin)
  194. ```
  195. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  196. ``Rückgabewert``: Der logische gelesene Wert.
  197. > HIGH ... Wert 1
  198. > LOW ... Wert 0
  199. **Beispiel:**
  200. ```C
  201. pinMode(17, INPUT);
  202. pullUpDnControl(17, PUD_DOWN);
  203. int value = digitalRead(17);
  204. if (value==HIGH)
  205. {
  206. // your code
  207. }
  208. ```
  209. ## Interrupts
  210. ### wiringPiISR
  211. Registriert eine Interrupt Service Routine (ISR) bzw. Funktion die bei Flankenwechsel ausgeführt wird.
  212. >>>
  213. ```C
  214. int wiringPiISR(int pin, int mode, void (*function)(void));
  215. ```
  216. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  217. ``mode``: Auslösende Flankenmodus
  218. - INT_EDGE_RISING ... Steigende Flanke
  219. - INT_EDGE_FALLING ... Fallende Flanke
  220. - INT_EDGE_BOTH ... Steigende und fallende Flanke
  221. ``*function``: Funktionspointer für ISR
  222. ``Rückgabewert``:
  223. > 0 ... Erfolgreich
  224. <!-- > <>0 ... Fehler, zur Zeit nicht implementiert -->
  225. Beispiel siehe wiringPiISRStop.
  226. ### wiringPiISRStop
  227. Deregistriert die Interrupt Service Routine (ISR) auf einem Pin.
  228. >>>
  229. ```C
  230. int wiringPiISRStop (int pin)
  231. ```
  232. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  233. ``Rückgabewert``:
  234. > 0 ... Erfolgreich
  235. <!-- > <>0 ... Fehler, zur Zeit nicht implementiert -->
  236. **Beispiel:**
  237. ```C
  238. static volatile int edgeCounter;
  239. static void isr(void) {
  240. edgeCounter++;
  241. }
  242. int main (void) {
  243. wiringPiSetupPinType(WPI_PIN_BCM);
  244. edgeCounter = 0;
  245. wiringPiISR (17, INT_EDGE_RISING, &isr);
  246. Sleep(1000);
  247. printf("%d rinsing edges\n", )
  248. wiringPiISRStop(17) ;
  249. }
  250. ```
  251. ### waitForInterrupt
  252. Wartet auf einen Aufruf der Interrupt Service Routine (ISR) mit Timeout.
  253. >>>
  254. ```C
  255. int waitForInterrupt (int pin, int mS)
  256. ```
  257. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  258. ``mS``: Timeout in Milisekunden.
  259. ``Rückgabewert``: Fehler
  260. > 0 ... Erfolgreich
  261. > -1 ... GPIO Device Chip nicht erfolgreich geöffnet
  262. > -2 ... ISR wurde nicht registriert (wiringPiISR muss aufgerufen werden)
  263. ## Hardware PWM (Pulsweitenmodulation)
  264. Verfügbare GPIOs: https://pinout.xyz/pinout/pwm
  265. ### pwmWrite
  266. Verändert den PWM Wert des Pins. Mögliche Werte sind 0-<PWM Range>
  267. >>>
  268. ```C
  269. pwmWrite(int pin, int value)
  270. ```
  271. ``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
  272. ``value``: PWM Wert
  273. ### pwmSetRange
  274. Setzt den Bereich für den PWM-Wert für alle PWM Pins bzw. PWM Kanäle.
  275. Für die Berechnung der PWM Frequenz (M/S Mode) gilt 19200/divisor/range.
  276. Bei Befehl ``pinMode(pin,PWM_OUTPUT)`` wird automatisch der Wert 1024 für den Teiler gesetzt.
  277. >>>
  278. ```C
  279. pwmSetRange (unsigned int range)
  280. ```
  281. ``range``: PWM Range
  282. ### pwmSetMode
  283. Setzt den PWM Modus für alle PWM Pins bzw. PWM Kanäle.
  284. >>>
  285. ```C
  286. pwmSetMode(int mode);
  287. ```
  288. ``mode``: PWM Modus
  289. - PWM_MODE_MS ... Mark/Space Modus (PWM Frequenz fix)
  290. - PWM_MODE_BAL ... Balanced Modus (PWM Frequenz variabel)
  291. **Support:**
  292. Raspberry Pi 5 unterstützt den Balanced Modus nicht!
  293. ### pwmSetClock
  294. Setzt den Teiler für den PWM Basistakt. Der Basistakt ist für alle Raspberry Pis auf 1900 kHz normiert.
  295. Für die Berechnung der PWM Frequenz (M/S Mode) gilt 19200/divisor/range.
  296. Bei Befehl ``pinMode(pin,PWM_OUTPUT)`` wird automatisch der Wert 32 für den Teiler gesetzt.
  297. >>>
  298. ```C
  299. pwmSetClock(int divisor)
  300. ```
  301. ``divisor``: Teiler (Raspberry Pi 4: 1-1456, alle anderen 1-4095)
  302. - 0 ... Deaktivert den PWM Takt bei Raspberry Pi 5, bei anderen Pi's wird divisor 1 benutzt
  303. **Support:**
  304. Der Raspberry Pi 4 hat aufgrund seines höheren internen Basistakt nur einen Einstellbereich von 1-1456.
  305. Ansonsten gilt 0-4095 für einen gültigen Teiler.
  306. **Beispiel:**
  307. ```C
  308. int main (void) {
  309. wiringPiSetupGpio() ;
  310. pwmSetRange(1024);
  311. pwmSetClock(35);
  312. pwmWrite(18, 512);
  313. pinMode(18, PWM_MS_OUTPUT);
  314. double freq = 19200.0/(double)pwmc/(double)pwmr;
  315. printf("PWM 50%% @ %g kHz", freq);
  316. delay(250);
  317. pinMode(18, PM_OFF);
  318. }
  319. ```
  320. ## I2C - Bus
  321. ``wiringPiI2CRawWrite`` und ``wiringPiI2CRawRead`` sind die neuen Funktionen der Version 3 mit denen nun direkt I2C-Daten gesendet und gelesen weden können.
  322. Die anderen Schreib- und Lese-Funktionen verwenden das SMBus-Protokoll, das üblicherweise bei I2C-Chips Verwendung findet.
  323. ### wiringPiI2CSetup
  324. Öffnet den default I2C-Bus am Raspberry Pi und adressiert das angegebene Gerät / Slave.
  325. >>>
  326. ```C
  327. wiringPiI2CSetup(const int devId)
  328. ```
  329. ``devId``: I2C-Gerät / Slave Adresse.
  330. ``Rückgabewert``: Datei Handle zum I2C-Bus
  331. > -1 ... Fehler bzw. EXIT
  332. **Beispiel**
  333. >>>
  334. ```C
  335. wiringPiI2CSetup(0x20);
  336. ```
  337. ### wiringPiI2CSetupInterface
  338. Öffnet den angebenen I2C-Bus und adressiert das angegebene I2C-Gerät / Slave.
  339. >>>
  340. ```C
  341. wiringPiI2CSetupInterface(const char *device, int devId)
  342. ```
  343. ``devId``: I2C-Gerät / Slave Adresse.
  344. ``Rückgabewert``: Datei Handle zum I2C-Bus
  345. > -1 ... Fehler bzw. EXIT
  346. **Beispiel**
  347. >>>
  348. ```C
  349. wiringPiI2CSetupInterface("/dev/i2c-1", 0x20);
  350. ```
  351. ### wiringPiI2CWrite / wiringPiI2CWriteReg8 / wiringPiI2CWriteReg16 / wiringPiI2CWriteBlockData
  352. ### wiringPiI2CRawWrite
  353. ## wiringPiI2CRead / wiringPiI2CReadReg8 / wiringPiI2CReadReg16 / wiringPiI2CReadBlockData
  354. ### wiringPiI2CRawRead
  355. >>>
  356. ```C
  357. int wiringPiI2CRawRead(int fd, uint8_t *values, uint8_t size)
  358. ```
  359. ``fd``: Datei Handle.
  360. ``values``: Lesepuffer.
  361. ``size``: Anzahl der Bytes die in den Lesepuffer gelesen werden sollen.
  362. ``Rückgabewert``: Anzahl der Bytes die gelesen wurden.
  363. **Beispiel**
  364. >>>
  365. ```C
  366. uint8_t i2cvalue;
  367. int result = wiringPiI2CRawRead(fd, &i2cvalue, 1);
  368. if (1 == result) {
  369. // 1 byte received, stored to i2cvalue
  370. } else {
  371. // error
  372. }
  373. ```
  374. ## SPI - Bus