Inhoudsopgave:
- Stap 1: Wat hebben we nodig?
- Stap 2: Hardwareverbindingen
- Stap 3: Python-software
- Stap 4: Microcontroller-software
- Stap 5: Conclusie
Video: PIC MCU en Python seriële communicatie: 5 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
Hallo, jongens! In dit project zal ik proberen mijn experimenten op PIC MCU en Python seriële communicatie uit te leggen. Via internet zijn er veel tutorials en video's over hoe te communiceren met PIC MCU via een virtuele terminal, wat erg handig is. In mijn hoofdproject is een van de vereisten echter om seriële communicatie tot stand te brengen tussen PIC MCU en Python, wat ik geen goede tutorial kon vinden. Dus laten we beginnen:)
Stap 1: Wat hebben we nodig?
Laten we dus eerst eens kijken wat we nodig hebben. Qua hardware:
- Zeker, PIC MCU, wat in mijn geval PIC16f877a is (je hebt dat bord niet nodig. Dit is om sommige vuile verbindingen te vereenvoudigen)
- USB naar TTL-converter om te communiceren met PIC MCU via USB-poort met behulp van TX- en RX-pinnen.
- MCU-programmeur, in mijn geval K150-programmeur, maar je kunt PicKit 2, 3 of iets anders gebruiken.
- En tot slot een computer:)
Qua software:
- Een IDE om python-code te schrijven, in mijn geval Pycharm, maar je kunt ook gewone Python IDE gebruiken.
- Een omgeving voor het programmeren van de MCU, in mijn geval MPLAB X IDE met CCS C-compiler.
Stap 2: Hardwareverbindingen
In de bijgevoegde afbeelding worden hardwareverbindingen gegeven die tussen PIC MCU en USB TTL-converter zijn, zoals hieronder:
RC7 (RX) ------------- TXD
RC6 (TX) ------------- RXD
GND -------------- GND
U hoeft de VCC-pin van de USB TTL-converter niet aan te sluiten (maar als u wilt, kunt u dit doen). Deze 3 verbindingen zijn voldoende.
Stap 3: Python-software
Laten we beginnen met het schrijven van software voor de Python-kant, die in ons geval de zender zal zijn, omdat deze de string naar de MCU zal sturen.
import serial #import serial librarydata = '24' #data die we zullen sturen data = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #connect to the port ser.write(a.encode()) #stuur de gegevens
Allereerst wordt de seriële bibliotheek geïmporteerd om de futures te gebruiken. We willen een voorbeeldreeksgegevens verzenden om in MCU-code te bevestigen dat we deze hebben geaccepteerd. Ik wil hier één ding opmerken. Daarom hebben we '\0' aan de string toegevoegd. Dit komt omdat het aan de MCU-kant onmogelijk is om de string volledig te lezen. Het wordt karakter voor karakter gelezen. We willen dus het einde van de string weten om te stoppen met lezen. Dus voegen we '\0' toe aan de string die het einde van de string aangeeft. Vervolgens maken we verbinding met de poort die is aangesloten op de MCU. U kunt die poort bepalen door te zoeken in 'Apparaatbeheer'. Let er dus op dat u zich op dezelfde poort bevindt. We sturen de gegevens immers naar de MCU. ".encode()" moet worden toegevoegd aan de stringgegevens om deze naar de ontvanger te kunnen sturen.
Stap 4: Microcontroller-software
Laten we dus eens kijken naar onze code voor MCU. Allereerst wil ik je de "config.h"-bestanden laten zien die niet vereist zijn, maar ik deed het voor de eenvoud. Wijzig hier de frequentie van uw MCU.
#ifndef CONFIG_H#define CONFIG_H
#erbij betrekken
#apparaat ADC=16
#FUSES NOWDT //Geen Watch Dog Timer
#FUSES NOBROWNOUT //Geen brownout-reset #FUSES NOLVP //Geen laagspanningsprgming, B3(PIC16) of B5(PIC18) gebruikt voor I/O
#use delay(crystal=6000000)
Laten we nu de hoofdcode bekijken:
#erbij betrekken
#erbij betrekken
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, pariteit=N, stop=1)
#define LED_RED PIN_D0
char inp; char cmp_="24"; char-buffer [3];
#int_rda
void serial_communication_interrupt() {disable_interrupts(int_rda); niet-ondertekend int i = 0; inp = getc(); putc(inp); while(inp != '\0') { buffer = inp; inp = getc(); putc(inp); i++; } }
nietig hoofd(nietig) {
set_tris_d(0x00); output_d(0xFF); enable_interrupts(GLOBAAL); while(1) { enable_interrupts(int_rda); if(strcmp(buffer, cmp_) == 0) output_low(LED_RED); anders output_high (LED_RED); } }
In het begin nemen we een stringbibliotheek op die we zullen gebruiken bij stringbewerkingen, wat in ons geval de string Compare-operatie (strcmp) is. Ons doel in deze code is dus om de led die op pin D0 is aangesloten aan te zetten als de verzonden waarde hetzelfde is als onze gegeven waarde, die "cmp_" gelijk is aan "24".
Allereerst schakelen we interrupt "rda" in, wat een interrupt zal veroorzaken wanneer gegevens worden verzonden.
Ten tweede, laten we eens kijken in ISR (interrupt service routine), die "serial_communication_interrupt" wordt genoemd. Binnenin schakelen we eerst de interrupt-vlag uit om de ontvangen waarde te lezen en de interrupt verder te veroorzaken. Daarna lezen we de string karakter voor karakter totdat we '\0' bereiken. Tijdens het lezen van de binnenkant van de string schrijven we ook elke char naar de buffer om de ontvangen string te krijgen.
Op het einde komen we weer even binnen. Hier vergelijken we onze bufferstring die ontvangen is en cmp_ string om te zien of we de string correct krijgen. Als ze gelijk zijn dan zet ik led aan, anders uit.*
* In code heb ik omgekeerd omdat mijn bord de D-poort-pinwaarden omkeert. Verander het in je code in:
if(strcmp(buffer, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);
Compileer het ten slotte en upload het naar je MCU en voer vervolgens de code uit in Python. Je zou de led moeten zien aangaan.
Stap 5: Conclusie
We hebben één taak met succes afgerond. Ik hoop dat het nuttig voor u zal zijn. Als je vragen hebt, aarzel dan niet om ze te stellen:) Tot het volgende project.
Aanbevolen:
Arduino seriële communicatie: 5 stappen
Arduino seriële communicatie: veel Arduino-projecten zijn afhankelijk van het verzenden van gegevens tussen verschillende Arduino's. Of u nu een hobbyist bent die een RC-auto, een RC-vliegtuig bouwt of een weerstation met een extern display ontwerpt, u moet weten hoe u op betrouwbare wijze overdracht serie
Arduino en Python seriële communicatie - toetsenbordweergave - Ajarnpa
Arduino en Python seriële communicatie - Toetsenbordweergave: dit project is gemaakt voor Mac-gebruikers, maar het kan ook worden geïmplementeerd voor Linux en Windows, de enige stap die anders zou moeten zijn, is de installatie
Draadloze seriële communicatie met Bluefruit: 4 stappen
Draadloze seriële communicatie met Bluefruit: Hier is een eenvoudige stapsgewijze handleiding om uw draden te vervangen door een Bluetooth low energy-verbinding: het kostte me een tijdje om dit uit te zoeken omdat er nauwelijks documentatie is om dit te doen met moderne Bluetooth low energy-technologie zoals als de Bluefrui
Webgebaseerde SmartMirror met seriële communicatie: 6 stappen
Webgebaseerde SmartMirror met behulp van seriële communicatie: deze instructable wordt geleverd met alle code klaar voor gebruik. De ontwikkeling was erg ingewikkeld, maar als het eenmaal is ingesteld, is het heel eenvoudig aan te passen. Neem een kijkje en geniet ervan;)
Seriële communicatie met ARM Cortex-M4: 4 stappen
Seriële communicatie met ARM Cortex-M4: dit is een op breadboard gebaseerd project dat ARM Cortex-M4 (Texas Instruments EK-TM4C123GXL) gebruikt voor seriële communicatie met behulp van Virtual Terminal. De uitvoer kan worden verkregen op een 16x2 LCD-scherm en invoer voor seriële communicatie kan worden gegeven in Serial Mo