Simon diyor ki, Mutlu Yıllar Ahududu Pi Pico! 21 Ocak 2021’de yayınlandı, Raspberry Pi’nin ilk yongası olan RP2040, 2021 için sahip olunması gereken mikro denetleyici oldu. 0,70 dolarlık yonga dünya çapındaki projelere güç veriyor. Basit yanıp sönen LED’lerden RP2040, 3D yazıcı kontrol kartlarına çok yönlü bir çiptir. aracılığıyla duyurulur Ahududu Pi PicoModern Arduino kartlarında kullanılan DIL paketine benzeyen 4 dolarlık bir mikrodenetleyici geliştirme kartı olan Pico, düşük maliyetli, birinci ve üçüncü taraf desteğiyle birinci taraf donanımıdır.
Pico’yu seviyoruz, birçok üreticinin istediği düşük maliyet ve kullanım kolaylığının doğru karışımı. Yeniden kullanma yeteneği Raspberry Pi eklentileri ve genel elektronik bileşenler dışarı çıkıp daha fazla aksesuar almamız gerekmediği anlamına geliyor. Pico’nun bu bölümde eksik olduğundan değil. Pimoroni, Adafruit ve Kitronik gibi şirketler, Pico deneyiminizi geliştirmek için tasarlanmış harika aksesuarları piyasaya sürdü.
Raspberry Pi Pico’nun ilk doğum gününü kutlamak için bir oyun yaptık. Yine de bu herhangi bir oyun değil, 1970’lerin sonlarında meşhur olan hafıza oyunu Simon’ın kendi versiyonumuz. Oyunun amacı rastgele seçilen renk dizisini eşleştirmektir. Doğru anlarsak, bir ışık gösterisi yaparız. Ama yanlış anlayın ve kırmızıyı göreceğiz.
Bu proje için yapılan donanım, Raspberry Pi Pico’nun sağladığı basitliğe bir selam olarak, tamamen breadboard tabanlıdır. Kablolama basittir: bir çıkışımız, sekiz LED NeoPixel çubuğumuz ve renk kodlu düğmeler biçiminde dört girişimiz var. Pico, Adafruit’in kullanımı kolay donanım kitaplıklarına sahip mükemmel MicroPython çatalı CircuitPython kullanılarak programlanmıştır.
O zaman bu partiyi başlatalım!
Bu proje için ihtiyacınız olacak
Raspberry Pi Pico ile Simon Oyunu Oluşturma
Yapının iki bölümü vardır. Dört basma düğmesi kullanıcı arabirimini oluşturur ve NeoPixel çubuğu bizim çıktımızdır.
NeoPixel, veri için GPIO 28’e ( CircuitPython’da GP28) bağlanır ve doğrudan USB veri yolundan güç sağlamak için 5V (VBUS) pinini kullanır. GND, Pico’daki herhangi bir GND’ye bağlanır.
Dört düğme Pico’daki dört GPIO pinine bağlanır.
Düğme rengi | Ahududu Pi Pico GPIO |
kırmızı | 27 |
Yeşil | GPIO 26 |
Mavi | 22 |
Sarı | GPIO 21 |
Ve buton devre tahtasındaki negatif rayı (- ile işaretli) kullanarak Pico’dan bir GND bağlantısı (Siyah tel) alıp bir GND rayı oluşturuyoruz. Oradan, düğmelere dört GND bağlantısı sağlıyoruz. Bu, düğmelerimizin basıldığında GND’ye (Toprak) çekeceği anlamına gelir.
Son devre yukarıdaki gibi görünüyor. Devam etmeden önce kablolamanızı kontrol edin.
CircuitPython ve kitaplıkları yükleyin
CircuitPython’u kurmak son derece basittir ve Adafruit’in bunun nasıl yapılacağına dair harika bir kılavuzu vardır. Takip et Adafruit’in talimatları En son sürümü yüklemek için.
Raspberry Pi Pico’muz artık dosya yöneticisinde bir sürücü olarak görünüyor. Sürücüye CIRCUTPY adı verilir ve orada bir dizi dosya ve klasör buluruz. Şu anda, odaklanmamız gerekiyor kitap Kitaplıklarla dolu bir ZIP dosyası indirmemiz ve projelerimiz için doğru dosyaları yüklememiz gerekiyor.
1. En son kitaplık paketini indirin CircuitPython sitesinden.
2. Dosyaları ayıklayın Masaüstünüze.
3. adafruit_pixelbuf.mpy ve neopixel.mpy’yi kopyalayın çıkarılan dosyalardan lib klasörüne DEVRE sürücünüzde.
Raspberry Pi Pico’da Simon Oyununun Kodunu Yazma
1. code.py dosyasını açın tercih ettiğiniz düzenleyicide CIRCUTPY sürücüsünün kökünde bulunur.
2. Herhangi bir kodu sil dosyanın içinde.
3. Oyunun hızını kontrol etmek ve GPIO’ya erişim için kitaplıkları içe aktarın. Time ve Board, yaygın CircuitPython kitaplıklarını kullanır. Zaman, kodu duraklatmak için işlevler içerirken, Board temel GPIO erişimi sağlar.
import time
import board
4. NeoPixels’in gelişmiş kontrolü için iki kitaplık daha içe aktarın. Colorwheel, gökkuşağı döngüsü efekti oluşturmak için kullanacağımız bir animasyon aracıdır. NeoPixel, sekiz RGB LED’i kontrol etmek için kullanılan kütüphanedir.
from rainbowio import colorwheel
import neopixel
5. İki son kitaplığı içe aktarın. Rastgele içe aktarma seçiminden ve üniforma ve digitailio’dan DigitalInOut, Direction ve Pull’u içe aktarın giriş/çıkış, pin yönü ve yukarı çekme dirençlerini desteklemek için. Rastgele’nin birçok işlevi vardır, ancak seçim, listelerden, demetlerden, sözlüklerden vb. “rastgele” seçim yapmamızı sağlar. Tekdüzen, kayan sayılar için rastgele bir sayı üretecidir. DigitalIO, GPIO’yu nasıl kullandığımıza ince ayar yapmak için Board kitaplığıyla birlikte çalışır. Bu durumda girişleri (düğmeleri) kullanmak ve GPIO pinlerinin dahili direncini yukarı çekecek şekilde ayarlamak istiyoruz (3,3V).
from random import choice, uniform
from digitalio import DigitalInOut, Direction, Pull
6. GPIO 28’i NeoPiksellerimizi kontrol etmek için kullanılan pin olarak ayarlayın, sonra num_pixels adında bir değişken oluşturun NeoPixel LED’lerinin sayısını saklamak için.
pixel_pin = board.GP28
num_pixels = 8
7. Bir nesne, “pikseller” oluşturun ve GPIO pinini ve piksel sayısını tanımlayan iki değişkeni kullanarak NeoPiksellere bağlanmak için kullanın. Ayrıca göz yorgunluğunu azaltmak için parlaklığı 0,3’e (%30) ayarladık.
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.3, auto_write=False)
8. GPIO 27’ye bağlı kırmızı düğmeyi temsil eden kırmızı bir nesne oluşturun.
red = DigitalInOut(board.GP27)
9. Kırmızı düğme için GPIO pinini giriş olarak ayarlayın.
red.direction = Direction.INPUT
10. Kırmızı düğmenin GPIO pinini yüksek çekecek şekilde ayarlayın. Bir yukarı çekme direnci kullanarak GPIO 27’yi 3.3V’a çekiyoruz. Düğmeyi Pico’ya bağlama şeklimiz kırmızı düğmeye basıldığında bu pimi GND’ye (düşük) çekecektir.
red.pull = Pull.UP
11. Yeşil düğme için işlemi tekrarlayın.
green = DigitalInOut(board.GP26)
green.direction = Direction.INPUT
green.pull = Pull.UP
12. Mavi için tekrar edin.
blue = DigitalInOut(board.GP22)
blue.direction = Direction.INPUT
blue.pull = Pull.UP
13. Sarı için tekrarlayın.
yellow = DigitalInOut(board.GP21)
yellow.direction = Direction.INPUT
yellow.pull = Pull.UP
14. Düğmeler için RGB renk değerlerini depolamak için beş grup (veri depolama nesneleri) oluşturun ve LED’leri kapatmak için.
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 150, 0)
OFF = (0, 0, 0)
15. Bir gökkuşağı efekti görüntüleyen tüm NeoPikseller arasında geçiş yapacak olan Rainbow_cycle adlı bir işlev oluşturun. Bu işlev, Adafruit’in standart “iplik testi” demosunun bir parçasıdır.
def rainbow_cycle(wait):
for j in range(255):
for i in range(num_pixels):
rc_index = (i * 256 // num_pixels) + j
pixels[i] = colorwheel(rc_index & 255)
pixels.show()
time.sleep(wait)
16. “Renkler” adında bir liste oluşturun ve bunu renk gruplarını saklamak için kullanın. daha önce oluşturduk.
colors = [RED, GREEN, BLUE, YELLOW]
17. 10 kez tekrar edecek bir for döngüsü oluşturun. Döngü her yinelendiğinde, oyun başladığında bir ışık gösterisi oluşturmak için Rainbow_cycle işlevini kullanır.
for i in range(10):
rainbow_cycle(0)
18. Projenin ana gövdesi, oyun kodunu çalıştıracak olan while True’dur. Bir while True döngüsü oluşturun ve piksel nesnesini çağırın LED’leri kapatmak için.
while True:
pixels.fill(OFF)
pixels.show()
19. Rastgele seçilen renk dizisini saklamak için iki boş liste oluşturun, ve Oyuncuların tahminlerini saklamak için.
rnd_colors = []
player = []
20. Oyunun başlamasını tetiklemek için bir if koşullu testi oluşturun. Oyuna başlamak için yeşil düğmeye basmalıyız. Bu pin bir pull-up direnci kullanılarak yukarı çekildiğinden, pin düşük (Yanlış) olduğunda oyunu başlatmak için tetiklememiz gerekiyor. Düğmeler, yukarı çekilen GPIO pinlerine ve GND’ye bağlanır. Yani düğmeye basıldığında pimler aşağı çekilir.
if green.value == False:
21. 0,3 ile 1,0 arasında rastgele seçilen bir kayan nokta değerini saklamak için bir “gecikme” değişkeni oluşturun. Çıktıyı bir ondalık basamağa biçimlendirmek için round() işlevini bunun etrafına sarın. Hata ayıklama için çıktıyı Python kabuğuna yazdırın. Bu, oynatıcıya gösterilen renk dizisi arasında bir duraklama oluşturmak için kullanılan 0,3 ile 1 arasında rastgele bir sayı üretecektir.
delay = round(uniform(0.3,1.0),1)
print(delay)
22. rnd_colors listesine rastgele seçilmiş dört renk eklemek için bir for döngüsü kullanın ve bunları hata ayıklama için Python kabuğuna yazdırın. Bunlar oyuncunun tahmin etmesi gereken renkler olacak.
for i in range(4):
rnd_colors.append(choice(colors))
print(rnd_colors)
23. Oynatıcıya renk sırasını gösterin. Bu for döngüsü, rnd_colors listesinde depolanan dört renk üzerinde yinelenir. Döngü her yinelendiğinde RGB değeri, o rengi göstermek için piksel.fill() ile birlikte kullanılır.
for color in rnd_colors:
print(color)
pixels.fill(color)
pixels.show()
24. Rengi göstermek için rastgele seçilen gecikmeyi kullanın, ardından aynı gecikmeyi kullanarak LED’leri kapatın.
time.sleep(delay)
pixels.fill(OFF)
pixels.show()
time.sleep(delay)
25. Oyuncu listesinin uzunluğunu kontrol etmek için bir süre döngüsü kullanın ve bu döngüye çift tuşa basma olasılığını azaltmak için 0,3 saniyelik bir gecikme ekleyin (geri dönme) Girintili kod, yalnızca oyuncu tarafından dörtten az tahmin olduğunda çalışacaktır.
while len(player) <4:
time.sleep(0
26. Her düğmenin durumunu okumak için bir if ifadesi oluşturun, basılan rengi saklayın ve hata ayıklama değerini gösterin. Birincisi kırmızı buton. Basıldığında, RGB renk değerini oynatıcı listesine ekleyecektir. Ardından, hata ayıklama için değeri Python kabuğuna yazdırın.
if red.value == False:
player.append((255,0,0))
print(player)
27. Oyuncuya geri bildirim vermek için, pikselleri kapatmadan önce NeoPikselleri 0,1 saniye boyunca seçtikleri renge ayarlayın.
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
28. Yeşil düğme için işlemi tekrarlayın. Bu koşulun doğru olup olmadığını kontrol etmek için bir elif (else if) kullanın.
elif green.value == False:
player.append((0,255,0))
print(player)
pixels.fill(GREEN)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
29. Mavi düğme için tekrarlayın.
elif blue.value == False:
player.append((0,0,255))
print(player)
pixels.fill(BLUE)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
30. Sarı düğme için tekrar edin.
elif yellow.value == False:
player.append((255, 150, 0))
print(player)
pixels.fill(YELLOW)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
31. Oyuncuların rastgele seçilen değerlere karşı tahminlerini kontrol etmek için bir if koşullu testi kullanın. Oyuncu dört tahminini girdikten sonra, oyunun başında seçilen değerlerle karşılaştırılır.
if player == rnd_colors:
32. Bir for döngüsü kullanın ve Rainbow_cycle() işlevini çalıştırmak için 10 kez yinelenecek şekilde ayarlayın oyuncunun kazandığını gösterir.
for i in range(10):
rainbow_cycle(0)
33. NeoPixels’i üç kez yanıp sönecek başka bir koşul oluşturun. Oyuncu, yanlış tahminde bulunursa NeoPixels’in kırmızı renkte yanıp söndüğünü görecektir.
else:
for i in range(3):
pixels.fill(RED)
pixels.show()
time.sleep(0.2)
pixels.fill(OFF)
pixels.show()
time.sleep(0.1)
34. Kodu Raspberry Pi Pico’nuza code.py olarak kaydedin ve oyun Rainbow_cycle() işlevini çalıştırarak başlayacaktır.
35. Yeşil tuşa basarak oyuna başlayın.
Raspberry Pico’da Simon Oyunu için Komple Kod Listesi
import time
import board
from rainbowio import colorwheel
import neopixel
from random import choice, uniform
from digitalio import DigitalInOut, Direction, Pull
#NeoPixel setup
pixel_pin = board.GP28
num_pixels = 8
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.3, auto_write=False)
#Button Setup
red = DigitalInOut(board.GP27)
red.direction = Direction.INPUT
red.pull = Pull.UP
green = DigitalInOut(board.GP26)
green.direction = Direction.INPUT
green.pull = Pull.UP
blue = DigitalInOut(board.GP22)
blue.direction = Direction.INPUT
blue.pull = Pull.UP
yellow = DigitalInOut(board.GP21)
yellow.direction = Direction.INPUT
yellow.pull = Pull.UP
# RGB Color Codes
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 150, 0)
OFF = (0, 0, 0)
#Rainbow Animation
def rainbow_cycle(wait):
for j in range(255):
for i in range(num_pixels):
rc_index = (i * 256 // num_pixels) + j
pixels[i] = colorwheel(rc_index & 255)
pixels.show()
time.sleep(wait)
#List of colors
colors = [RED, GREEN, BLUE, YELLOW]
#The "attract sequence to entice people to play
for i in range(10):
rainbow_cycle(0)
while True:
pixels.fill(OFF)
pixels.show()
rnd_colors = []
player = []
#Wait for the green button start the game
if green.value == False:
delay = round(uniform(0.3,1.0),1)
print(delay)
for i in range(4):
rnd_colors.append(choice(colors))
print(rnd_colors)
for color in rnd_colors:
print(color)
pixels.fill(color)
pixels.show()
time.sleep(delay)
pixels.fill(OFF)
pixels.show()
time.sleep(delay)
#Player has four guesses, each guess saves the color choice to player list
while len(player) <4:
time.sleep(0.3)
if red.value == False:
player.append((255,0,0))
print(player)
pixels.fill(RED)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
elif green.value == False:
player.append((0,255,0))
print(player)
pixels.fill(GREEN)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
elif blue.value == False:
player.append((0,0,255))
print(player)
pixels.fill(BLUE)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
elif yellow.value == False:
player.append((255, 150, 0))
print(player)
pixels.fill(YELLOW)
pixels.show()
time.sleep(0.1)
pixels.fill(OFF)
pixels.show()
#If the player guesses correctly they get a nice rainbow
if player == rnd_colors:
for i in range(10):
rainbow_cycle(0)
#If you lose, you see red!
else:
for i in range(3):
pixels.fill(RED)
pixels.show()
time.sleep(0.2)
pixels.fill(OFF)
pixels.show()
time.sleep(0.1)