Controle PWM de 10 LEDs com Python e Arduino

Controle PWM de 10 LEDs com Python e Arduino

Neste post vamos ver o controle PWM de 10 LEDs com Python e Arduino, vamos fazer uma IDE usando a biblioteca Tkinter do Python.

No vídeo abaixo vocês podem conferir a montagem do circuito e funcionamento:

Materiais utilizados

Para o nosso projeto vamos utilizar os seguintes componentes eletrônicos:
* 10 – LEDs;
* 10 – Resistores de 270 Ω;
* 2 – Resistores 10 k;
* 1 – Transistor MOSFET 2N7002;
* 1 – Arduino UNO.

Código do Arduino

Abaixo é apresentado o código utilizado no Arduino.

/*
     Wantronics
     Projeto: Controle PWM de 10 LEDs com Python e Arduino
     01 / 10 / 2023
     CLP Duino Nano Wantronics
*/
 
#define out1 13
#define out2 12
#define out3 11
#define out4 10
#define out5 9
#define out6 8
#define out7 7
#define out8 6
#define out9 5
#define out10 4
#define pwm 3

int i = 0;
int column[10] = {out1, out2, out3, out4, out5, out6, out7, out8, out9, out10};

void limpaColumn() {
  for (i = 0; i < 10; i++) {
    digitalWrite(column[i], LOW);
  }
}

void bargraph(int LED) {
    for (i = 0; i < LED; i++) {
    digitalWrite(column[i], HIGH);
  }
}

void setup() {
  pinMode (out1, OUTPUT);
  pinMode (out2, OUTPUT);
  pinMode (out3, OUTPUT);
  pinMode (out4, OUTPUT);
  pinMode (out5, OUTPUT);
  pinMode (out6, OUTPUT);
  pinMode (out7, OUTPUT);
  pinMode (out8, OUTPUT);
  pinMode (out9, OUTPUT);
  pinMode (out10, OUTPUT);
  pinMode (pwm, OUTPUT);
  
  Serial.begin (9600);
}

void loop() {
  while (Serial.available() == 0) {}
  String serialUSB = Serial.readString();
  serialUSB.trim();

  if (serialUSB == "0") {
    limpaColumn();
  }

  if (serialUSB == "1") {
    limpaColumn();
    bargraph(1);
  }
  
    if (serialUSB == "2") {
    limpaColumn();
    bargraph(2);
  }

  if (serialUSB == "3") {
    limpaColumn();
    bargraph(3);
  }
  
    if (serialUSB == "4") {
    limpaColumn();
    bargraph(4);
  }

  if (serialUSB == "5") {
    limpaColumn();
    bargraph(5);
  }
  
    if (serialUSB == "6") {
    limpaColumn();
    bargraph(6);
  }

  if (serialUSB == "7") {
    limpaColumn();
    bargraph(7);
  }
  
    if (serialUSB == "8") {
    limpaColumn();
    bargraph(8);
  }

  if (serialUSB == "9") {
    limpaColumn();
    bargraph(9);
  }
  
    if (serialUSB == "A") {
    limpaColumn();
    bargraph(10);
  }
  
  //Pwm control
  if (serialUSB == "B") {
    analogWrite(pwm, 0);
  }

  if (serialUSB == "C") {
   analogWrite(pwm, 25);
  }
  
  if (serialUSB == "D") {
    analogWrite(pwm, 50);
  }

  if (serialUSB == "E") {
    analogWrite(pwm, 75);
  }
  
  if (serialUSB == "F") {
   analogWrite(pwm, 100);
  }

  if (serialUSB == "G") {
   analogWrite(pwm, 125);
  }
  
  if (serialUSB == "H") {
   analogWrite(pwm, 150);
  }

  if (serialUSB == "I") {
    analogWrite(pwm, 175);
  }
  
  if (serialUSB == "J") {
    analogWrite(pwm, 200);
  }

  if (serialUSB == "K") {
   analogWrite(pwm, 225);
  }
  
  if (serialUSB == "L") {
   analogWrite(pwm, 255);
  }

}

Código Python para IDE

Abaixo é apresentado o código Python:

import serial
import time
from tkinter import *

root = Tk()

# COM4 deve ser modificado manulmente de acordo com a porta onde o Arduino está conectado
ser = serial.Serial('COM4',
                    baudrate = 9600,
                    bytesize = serial.EIGHTBITS,
                    parity = serial.PARITY_NONE,
                    stopbits = serial.STOPBITS_ONE,
                    timeout = 1,
                    xonxoff = 0,
                    rtscts = 0)
ser.setDTR(False)
time.sleep(1)
ser.flushInput()
ser.setDTR(True)


def ligaLeds(*args):
    if ledScale.get() == 0:
        x = str(0)
        ser.write(x.encode())
    elif ledScale.get() == 1:
        x = str(1)
        ser.write(x.encode())
    elif ledScale.get() == 2:
        x = str(2)
        ser.write(x.encode())
    elif ledScale.get() == 3:
        x = str(3)
        ser.write(x.encode())
    elif ledScale.get() == 4:
        x = str(4)
        ser.write(x.encode())
    elif ledScale.get() == 5:
        x = str(5)
        ser.write(x.encode())
    elif ledScale.get() == 6:
        x = str(6)
        ser.write(x.encode())
    elif ledScale.get() == 7:
        x = str(7)
        ser.write(x.encode())
    elif ledScale.get() == 8:
        x = str(8)
        ser.write(x.encode())
    elif ledScale.get() == 9:
        x = str(9)
        ser.write(x.encode())
    elif ledScale.get() == 10:
        ser.write('A'.encode())

def pwm(*args):
    if pwmScale.get() == 0:
        ser.write('B'.encode())
    elif pwmScale.get() == 10:
        ser.write('C'.encode())
    elif pwmScale.get() == 20:
        ser.write('D'.encode())
    elif pwmScale.get() == 30:
        ser.write('E'.encode())
    elif pwmScale.get() == 40:
        ser.write('F'.encode())
    elif pwmScale.get() == 50:
        ser.write('G'.encode())
    elif pwmScale.get() == 60:
        ser.write('H'.encode())
    elif pwmScale.get() == 70:
        ser.write('I'.encode())
    elif pwmScale.get() == 80:
        ser.write('J'.encode())
    elif pwmScale.get() == 90:
        ser.write('K'.encode())
    elif pwmScale.get() == 100:
        ser.write('L'.encode())

ledLabel = Label(text = "LEDs").pack()

ledScale = Scale(root,
                from_ = 0,
                to = 10,
                length = 800,
                width = 200,
                orient = HORIZONTAL,
                command = ligaLeds)
myScaleA.pack()

ledLabel = Label(text = "PWM").pack()

pwmScale = Scale(root,
                from_ = 0,
                to = 100,
                length = 800,
                width = 200,
                orient = HORIZONTAL,
                resolution = 10,
                command = pwm)
myScaleB.pack()

root.mainloop()

Diagrama esquemático

Abaixo é mostrado o diagrama esquemático do circuito utilizado. A alimentação foi feita pela porta USB do notebook.

Diagrama esquemático

Conclusão

Evoluímos o nosso projeto de controle com Python e Arduino, agora podemos controlar mais LEDs e com dois scrolls. Agora além de controlar a intensidade luminosa também podemos controlar a quantidade de LEDs que devem ser ligados. O projeto pode ser melhorado ainda mais, como por exemplo, trocar o acionamento dos LEDs de scrolls para botões. Tudo vai depender do que se precisa para cada aplicação.

E neste post vimos o controle PWM de 10 LEDs com Python e Arduino, até o próximo post.