INHOUDSOPGAWE:
- Stap 1: Wat het ons nodig?
- Stap 2: Hardewareverbindings
- Stap 3: Python -sagteware
- Stap 4: Microcontroller sagteware
- Stap 5: Gevolgtrekking
Video: Seriële kommunikasie van PIC MCU en Python: 5 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:25
Hallo ouens! In hierdie projek sal ek probeer om my eksperimente oor PIC MCU en Python seriële kommunikasie te verduidelik. Op die internet is daar baie tutoriale en video's oor hoe om met PIC MCU via virtuele terminale te kommunikeer, wat baie handig is. In my hoofprojek is een van die vereistes egter om reële kommunikasie tussen PIC MCU en Python tot stand te bring, wat ek nie 'n goeie handleiding kon vind nie. So, kom ons begin:)
Stap 1: Wat het ons nodig?
Dus, laat ons eers kyk wat ons nodig het. Wat hardeware betref:
- Sekerlik, PIC MCU, wat in my geval PIC16f877a is (u het nie die bord nodig nie. Dit is om vuil verbindings te vereenvoudig)
- USB na TTL -omskakelaar om met PIC MCU via USB -poort te kommunikeer deur TX- en RX -penne te gebruik.
- MCU -programmeerder, wat in my geval K150 -programmeerder is, maar u kan PicKit 2, 3 of enigiets anders gebruik.
- En laastens 'n rekenaar:)
Wat sagteware betref:
- 'N IDE om python -kode te skryf, wat in my geval Pycharm is, maar u kan ook gewone Python IDE gebruik.
- 'N Omgewing vir die programmering van die MCU, wat in my geval MPLAB X IDE is met CCS C -samesteller.
Stap 2: Hardewareverbindings
Op die foto word aangehegte hardewareverbindings gegee wat tussen PIC MCU en USB TTL -omskakelaar is, soos hieronder:
RC7 (RX) ------------ TXD
RC6 (TX) ------------ RXD
GND -------------- GND
U hoef nie die VCC -pen van die USB TTL -omskakelaar aan te sluit nie (maar as u wil, kan u dit doen). Hierdie 3 verbindings is redelik genoeg.
Stap 3: Python -sagteware
Kom ons begin sagteware skryf vir die Python -kant wat in ons geval die sender sal wees, want dit stuur die string na die MCU.
import serial #import serial librarydata = '24' #data wat ons data sal stuur = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #send die data
In die eerste plek word die reeksbiblioteek ingevoer om die toekoms daarvan te gebruik. Ons wil 'n voorbeeld van stringdata stuur om in die MCU -kode te bevestig dat ons dit aanvaar het. Ek wil hier een ding opmerk. Daarom het ons '\ 0' by die string gevoeg. Dit is omdat dit aan die MCU -kant onmoontlik is om die snaar heeltemal te lees. Dit word karakter vir karakter gelees. Ons wil dus die einde van die snaar ken om op te hou lees. Ons voeg dus '\ 0' by die string wat die einde van die string aandui. Dan maak ons verbinding met die poort wat aan die MCU gekoppel is. U kan die poort bepaal deur in 'Toestelbestuurder' te soek. Wees dus versigtig dat u op dieselfde poort is. Ons stuur immers die data na die MCU. ".encode ()" moet by die stringdata gevoeg word om dit na die ontvanger te kan stuur.
Stap 4: Microcontroller sagteware
Laat ons dus ons kode vir MCU sien. Eerstens wil ek u die 'config.h' -lêer aan die binnekant wys, maar ek het dit eenvoudig gedoen. Verander hier net die frekwensie van u MCU.
#ifndef CONFIG_H#definieer CONFIG_H
#insluit
#toestel ADC = 16
#FUSES NOWDT // Geen waghondtimer nie
#VEILIGHEDE NOBROWNOUT // Geen terugbranding nie
#gebruiksvertraging (kristal = 6000000)
Kom ons kyk nou na die hoofkode:
#insluit
#insluit
#gebruik rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, pariteit = N, stop = 1)
#definieer LED_RED PIN_D0
char inp; char cmp _ = "24"; char buffer [3];
#int_rda
ongeldig serial_communication_interrupt () {disable_interrupts (int_rda); ongetekende int i = 0; inp = getc (); putc (inp); terwyl (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); ek ++; }}
void main (void) {
stel_tris_d (0x00); uitvoer_d (0xFF); enable_interrupts (GLOBAL); terwyl (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); anders output_high (LED_RED); }}
Aan die begin bevat ons stringbiblioteek, wat ons sal help in stringbewerkings, wat in ons geval stringvergelyking (strcmp) is. Ons doel met hierdie kode is dus om die LED aan te skakel wat aan die pen D0 gekoppel is as die oordraagbare waarde dieselfde is as ons gegewe waarde, wat "cmp_" is wat gelyk is aan "24".
In die eerste plek aktiveer ons interrupt "rda" wat onderbrekings sal veroorsaak wanneer data oorgedra word.
Tweedens, kom ons kyk na die ISR (onderbreek diensroetine), wat 'serial_communication_interrupt' genoem word. Binne -in skakel ons eers die interrupt -vlag uit om die ontvangde waarde te lees en verder te onderbreek. Daarna lees ons die string karakter vir karakter totdat ons '\ 0' bereik. Terwyl ons binne die string lees, skryf ons ook elke char na die buffer om die string te ontvang.
Aan die einde kom ons weer binne. Hier vergelyk ons ons bufferstring wat string en cmp_ string ontvang, om te sien of ons die string korrek kry. As hulle gelyk is, skakel ek LED aan, anders skakel ek af.*
*In die kode het ek omgekeer omdat my bord die waardes van die D -poort omkeer. Verander dit in u kode na:
if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); anders output_low (LED_RED);
Stel dit ten slotte saam en laai dit op na u MCU en voer dan kode in Python uit. U moet die LED sien aanskakel.
Stap 5: Gevolgtrekking
Ons het een taak suksesvol voltooi. Ek hoop dat dit vir u nuttig sal wees. As u enige vrae het, moet asseblief nie huiwer om dit te vra nie:) Tot die volgende projek.
Aanbeveel:
Framboos PI 3 - Aktiveer seriële kommunikasie met TtyAMA0 na BCM GPIO 14 en GPIO 15: 9 stappe
Raspberry PI 3 - Aktiveer seriële kommunikasie met TtyAMA0 na BCM GPIO 14 en GPIO 15: Ek het onlangs daarin belanggestel om UART0 op my Raspberry Pi (3b) moontlik te maak, sodat ek dit direk kon koppel aan 'n RS -232 seinvlak toestel met 'n standaard 9 -speld d-sub-aansluiting sonder om deur 'n USB-na-RS-232-adapter te hoef te gaan. Deel van my interes
Seriële kommunikasie van Arduino: 5 stappe
Seriële kommunikasie van Arduino: Baie Arduino -projekte maak staat op die oordrag van data tussen verskeie Arduino's, of u nou 'n stokperdjie is wat 'n RC -motor, 'n RC -vliegtuig bou of 'n weerstasie met 'n afstandskerm ontwerp, u moet weet hoe om betroubaar te wees dra seria oor
Seriële kommunikasie van Arduino en Python - Toetsenbordvertoning: 4 stappe
Seriële kommunikasie van Arduino en Python - Toetsenbordvertoning: hierdie projek is gemaak vir Mac -gebruikers, maar dit kan ook geïmplementeer word vir Linux en Windows, die enigste stap wat anders moet wees, is die installasie
Draadlose seriële kommunikasie met behulp van Bluefruit: 4 stappe
Draadlose seriële kommunikasie met behulp van Bluefruit: Hier is 'n eenvoudige stap -vir -stap gids om u drade te vervang deur 'n Bluetooth -laenergieverbinding: dit het my 'n rukkie geneem om dit uit te vind, want daar is amper geen dokumentasie om dit te doen met moderne Bluetooth -lae -energie -tegnologie soos soos die Bluefrui
Seriële kommunikasie met behulp van ARM Cortex-M4: 4 stappe
Seriële kommunikasie met behulp van ARM Cortex-M4: Dit is 'n broodbordgebaseerde projek wat ARM Cortex-M4 (Texas Instruments EK-TM4C123GXL) gebruik vir seriële kommunikasie met behulp van virtuele terminale. Die uitset kan verkry word op 16x2 LCD -skerm en ingang vir seriële kommunikasie kan gegee word in Serial Mo