# 9. Output devices¶

## Group assignment:¶

• Measure the power consumption of an output device.

• Document your work to the group work page and reflect on your individual page what you learned

## Individual assignment:¶

• Add an output device to a microcontroller board you’ve designed and program it to do something.

Hi! For this week, we’ve chosen a servomotor and DC motor with the board we designed for the mission.

## Servomoteur¶

A servomotor is a device used in many systems to precisely control the position, speed or acceleration of a mechanism. It usually consists of an electric motor, a control circuit and a feedback mechanism.

Circuit diagram

Using the board we’ve designed, we’ve wired up our servomotor, and used a buzzer to produce a sound when the servomotor rotates.

## TEST 1¶

We’ve written code in micropython using the Thonny editor introduced in Week 6.

Code

Library

``````from machine import Pin, PWM
import time
``````

Definition of the GPIO pin to which the servomotor is connected

``````servo_pin = Pin(3)
buzzer_pin = Pin(4, Pin.OUT)  # Définition de la broche GPIO pour le buzzer
``````

PWM initialization for servomotor control

``````servo_pwm = PWM(servo_pin, freq=50)

def set_angle(angle):
``````

Conversion of angle to PWM pulse width (500 to 2500 µs for a range of 0 to 180 degrees)

``````    pulse_width = int((angle / 180.0) * (2500 - 500) + 500)
servo_pwm.duty_u16(pulse_width * 65536 // 20000)  # Conversion de la largeur d'impulsion en degrés

def play_train_sound():
# Jouer un son de train
buzzer_pin.on()
time.sleep_ms(100)
buzzer_pin.off()
time.sleep_ms(50)

while True:
# Faire tourner le servomoteur de 0 à 180 degrés
for angle in range(0, 181, 10):
set_angle(angle)
play_train_sound()  # Jouer le son de train
time.sleep_ms(10)  # Attendre 30 ms pour que le servomoteur atteigne la position

# Faire tourner le servomoteur de 180 à 0 degrés
for angle in range(180, -1, -10):
set_angle(angle)
play_train_sound()  # Jouer le son de train
time.sleep_ms(10)  # Attendre 30 ms pour que le servomoteur atteigne la position
``````

TEST 1 Result

## TEST 2¶

We’re going to program a DC motor using the board we’ve designed and a driver.

DC motor

Module L298N

The L298N module is a popular double H-bridge motor controller used to control the speed and direction of DC motors and bipolar stepper motors.

Circuit diagram

Code

Library

``````//*******************************************************************************//
// Association of the L298N inputs with the outputs used on our Arduino Uno //
//*******************************************************************************//
import machine
import utime
``````

Pin definition

``````borneENA = machine.PWM(machine.Pin(26))
borneIN1 = machine.Pin(27, machine.Pin.OUT)
borneIN2 = machine.Pin(28, machine.Pin.OUT)
borneIN3 = machine.Pin(29, machine.Pin.OUT)
borneIN4 = machine.Pin(6, machine.Pin.OUT)
borneENB = machine.PWM(machine.Pin(5))
``````
Program constants

``````delaiChangementVitesse = 20
vitesseMinimale = 60
vitesseMaximale = 200
``````

Direction of rotation

``````MARCHE_AVANT = 'V'
MARCHE_ARRIERE = 'R'
``````

Direction of rotation setting function

``````def configurerSensDeRotationPontA(sensDeRotation):
if sensDeRotation == MARCHE_AVANT:
borneIN1.value(1)
borneIN2.value(0)
elif sensDeRotation == MARCHE_ARRIERE:
borneIN1.value(0)
borneIN2.value(1)
``````

Motor speed change function

``````def changeVitesseMoteurPontA(nouvelleVitesse):
borneENA.duty_u16(nouvelleVitesse * 256)  # Le RP2040 utilise une résolution de 16 bits pour le PWM
``````

Output pin configuration

``````borneENA.freq(1000)  # PWM signal frequency
borneENB.freq(1000)
borneIN1.value(0)
borneIN2.value(0)
borneIN3.value(0)
borneIN4.value(0)
``````

Main loop

``````while True:
# MARCHE AVANT
configurerSensDeRotationPontA(MARCHE_AVANT)
for vitesse in range(vitesseMinimale, vitesseMaximale):
changeVitesseMoteurPontA(vitesse)
utime.sleep_ms(delaiChangementVitesse)

for vitesse in range(vitesseMaximale, vitesseMinimale, -1):
changeVitesseMoteurPontA(vitesse)
utime.sleep_ms(delaiChangementVitesse)

# Pause
changeVitesseMoteurPontA(0)
utime.sleep(1)

# MARCHE ARRIERE
configurerSensDeRotationPontA(MARCHE_ARRIERE)
for vitesse in range(vitesseMinimale, vitesseMaximale):
changeVitesseMoteurPontA(vitesse)
utime.sleep_ms(delaiChangementVitesse)

for vitesse in range(vitesseMaximale, vitesseMinimale, -1):
changeVitesseMoteurPontA(vitesse)
utime.sleep_ms(delaiChangementVitesse)

# Pause
changeVitesseMoteurPontA(0)
utime.sleep(1)
``````
TEST 2 Result

in reality, this is the type of motor we’re going to use for our robot’s navigation, so we’ve decided to write a program to see how it works.

this link will take you to a video of the robot being navigated by the motor

## File source¶

End

Last update: July 17, 2024