Inhoudsopgave:

PIC MCU en Python seriële communicatie: 5 stappen
PIC MCU en Python seriële communicatie: 5 stappen

Video: PIC MCU en Python seriële communicatie: 5 stappen

Video: PIC MCU en Python seriële communicatie: 5 stappen
Video: Webinar Python: Een makkelijke manier om microcontrollers te programmeren 2024, November
Anonim
PIC MCU en Python seriële communicatie
PIC MCU en Python seriële communicatie
PIC MCU en Python seriële communicatie
PIC MCU en Python seriële communicatie

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?

Wat hebben we nodig?
Wat hebben we nodig?
Wat hebben we nodig?
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

Hardware-verbindingen
Hardware-verbindingen

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: