🐍 MicroPython روی رزبری پای پیکو: اولین برنامهی پایتون برای الکترونیک
اگر کمی پایتون بلدی یا میخواهی یاد بگیری، رزبری پای پیکو بهترین راه برای ورود به الکترونیک است. روی پیکو یک نسخهی کوچک پایتون به اسم MicroPython اجرا میشود و با چند خط، LED روشن میکنی و سنسور میخوانی. در شبیه ساز مدار ما، همین کد را بدون برد امتحان میکنی: مفسر واقعی MicroPython داخل مرورگر اجرا میشود.
فرق MicroPython با آردوینو
| آردوینو C++ | MicroPython | |
|---|---|---|
| شکل برنامه | setup() و loop() | از بالا به پایین اجرا میشود؛ حلقه را خودت با while True: مینویسی |
| صبر کردن | delay(500) | time.sleep(0.5) یا time.sleep_ms(500) |
| پایهی خروجی | pinMode و digitalWrite | Pin(15, Pin.OUT) و led.value(1) |
| آنالوگ | analogRead: ۰ تا ۱۰۲۳ | ADC(26).read_u16(): ۰ تا ۶۵۵۳۵ |
| تورفتگی | آکولاد { } | فاصلهی اول خط (حتماً یکسان) |
۱) چشمکزن
from machine import Pin
import time
led = Pin("LED", Pin.OUT) # the on-board LED (GP25)
while True:
led.toggle()
time.sleep(0.5)
Pin("LED") همان LED روی خود برد است. toggle() روشنش را خاموش و خاموشش را روشن میکند. آمادهاش را در پروژهی چشمکزن با MicroPython ببین.
۲) پتانسیومتر و نور LED (ADC و PWM)
from machine import Pin, ADC, PWM
import time
knob = ADC(26) # GP26 = ADC0
led = PWM(Pin(15), freq=1000)
while True:
led.duty_u16(knob.read_u16())
time.sleep_ms(50)
عدد ADC و PWM در MicroPython هر دو از ۰ تا ۶۵۵۳۵ است، پس عدد پتانسیومتر را مستقیم به LED میدهیم. مدار آماده: دیمر LED با MicroPython.
۳) دکمه با وقفه (irq)
from machine import Pin
led = Pin(15, Pin.OUT)
button = Pin(14, Pin.IN, Pin.PULL_UP) # pressed = 0
def on_press(pin):
led.toggle()
button.irq(trigger=Pin.IRQ_FALLING, handler=on_press)
با PULL_UP دکمه وقتی فشرده نیست ۱ است و وقتی فشارش بدهی ۰ میشود؛ برای همین «لبهی پایینرونده» (IRQ_FALLING) یعنی «همین الان فشار داده شد». مدار آماده: دکمه و وقفه با MicroPython.
خطاهای رایج
- IndentationError: فاصلهی اول خطهای داخل
whileیاdefیکسان نیست. همه را ۴ فاصله بگذار. - NameError: name 'Pin' isn't defined: خط
from machine import Pinرا فراموش کردهای. - LED روشن نمیشود: شمارهی GP را با سیمکشی مقایسه کن؛ در پیکو شمارهی پایه روی برد با شمارهی GP فرق دارد.
در شبیهساز، پیغام خطا با شمارهی خط در Serial Monitor میآید، درست مثل برد واقعی.
تازهها: input()، UART، LCD و DHT
گفتوگو با برنامه: input() از جعبهی Serial Monitor میخواند. جوابش همیشه متن است، پس برای عدد int() بگیر. پروژه: گفتوگو با input().
n = input("How many blinks? ")
try:
n = int(n)
except ValueError:
print("Please type a number")
UART و بلوتوث: UART(0) همان Serial Monitor است و UART(1) به ماژول HC-05 و «گوشی مجازی» وصل است؛ any() میگوید پیامی رسیده یا نه و readline() آن را میخواند. پروژه: UART و بلوتوث با MicroPython.
LCD و دماسنج: با i2c_lcd روی LCD کاراکتری I2C مینویسی و با dht.DHT11 دما و رطوبت میخوانی؛ i2c.scan() هم آدرس قطعههای وصل را نشان میدهد.
from machine import Pin, I2C
from i2c_lcd import I2cLcd
import dht
i2c = I2C(0, sda=Pin(4), scl=Pin(5))
print(i2c.scan()) # [39] = 0x27, the LCD
lcd = I2cLcd(i2c, 0x27, 2, 16)
sensor = dht.DHT11(Pin(15))
sensor.measure()
lcd.putstr("Temp: %d C" % sensor.temperature())
مدار کامل: LCD و DHT11 با MicroPython.
MicroPython را روی پیکو امتحان کن 🐍