Liste Elemanlarını Modül İçerisindeki Methodlarda Parametre Olarak Kullanamıyorum

Merhabalar, okullarda Robotik ve Kodlama eğitimi için çeşitli eğitim robotları kullanılmaktadır. LEGO firmasının ürettiği Mindstorm EV3 bu robot setlerinden birisidir.

EV3, micro-python aracılığı ile Python dili kullanılarak kodlanabilmektedir. Bunun için VS Code editörü üzerinden ilgili eklenti indirilerek söz konusu işlem yapılmaktadır.(https://le-www-live-s.legocdn.com/sc/media/files/ev3-micropython/ev3micropythonv100-71d3f28c59a1e766e92a59ff8500818e.pdf Bkz. Sayfa 4)

Bu konuda Türkçe döküman hazırlıyorum. Robot ile Temel seviyede Python eğitimi ile alakalı çalışma yapıyorum.

Sorunumu şu;

#!/usr/bin/env pybricks-micropython

from pybricks import ev3brick as brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import (Port, Stop, Direction, Button, Color,
                                 SoundFile, ImageFile, Align)
from pybricks.tools import print, wait, StopWatch
from pybricks.robotics import DriveBase


# Write your program here

renk_listesi = [Color.BLUE, Color.GREEN, Color.YELLOW, Color.RED, Color.WHITE, Color.BROWN, Color.ORANGE, Color.BLACK]

for renk in renk_listesi:
    brick.light(renk)
    wait(1000)

Normalde brick.light(Color.GREEN) kodu ile robotun ışıkları yeşil yanıyor. Benim yapmak istediğim 1 sn aralıkla sırasıyla listedeki renklerde ışık verilmesi. Bunun için yukarıdaki listeyi tanımladım. Altında döngü oluşturdum fakat hata alıyorum.

print(Color.RENK) şeklinde çıktı aldığımda integer değerler alıyorum. Aldığım integer değeri brick.light(integer_deger) şeklinde kullandığımda robot o renk ışığını sorunsuz bir şekilde yakıyor. print(renk_listesi[2]) şeklinde deneme yaptığımda yine o rengin integer değerini alıyorum.

for döngüsünü aşağıdaki şekilde çalıştırdığımda

for renk in renk_listesi:
    print(renk)
    wait(1000)

liste içindeki elemanların integer karşılıkları ekrana basılıyor. Fakat aşağıdaki gibi yaptığımda hata alıyorum :frowning:

for renk in renk_listesi:
    brick.light(renk)
    wait(1000)

brick.light(renk) kod satırı ile ilgili aşağıdaki hata mesajını veriyor

Traceback (most recent call last):
  File "/home/robot/motor_test/main.py", line 16, in <module>
ValueError: Invalid argument

Kaç saat kafa patlattım niye olmadı anlamadım. Önerilerinizi bekliyorum.

Bir şeyi merak ettim, örneğin Color.BLUE hangi argümana değer olarak geliyor. Onun ismini yazarak çalıştırınca yine aynı sorunu alacak mısınız merak ettim.
Yani:

brick_light(color=renk) 

gibi çalıştırınca da aynı sorunu mu veriyor merak ettim. Bu parametrenin ismini help(brick_light) ile öğrenebilirsiniz.

1 Like

Tavsiyeniz üzere brick.light(Color=BLUE) şeklinde deneme yaptım. BLUE tanımlı değil şeklinde hata verdi.
help(brick.light) çıktı vermiyor.
help(brick.light()) fonksiyonunun bir argümanı olmalı, fakat hiç girilmemiş şeklinde hata oluşturuyor.

Bağlantısında Sayfa 18’de (Kapak sayfaları haricinde 16’ya denk geliyor) açıklama aşağıdaki gibi yapılmış;

3.2. Light
light(color)
Set the color of the brick light.
Parameters color (Color)Color of the light. Choose Color.BLACK or None to turn the
light off.

Example:

# Make the light red
brick.light(Color.RED)
# Turn the light off
brick.light(None)

Bu açıklama ile ilgili PDF dökümanında 32. sayfadaki Color bağlantısına baktığımda ise aşağıdaki gibi yazıyor; (Kapak sayfaları haricinde 30. sayfa)

class Color
Light or surface color.

BLACK
BLUE
GREEN
YELLOW
RED
WHITE
BROWN
ORANGE
PURPLE

Sonra ürünün diğer bir destek sayfasını inceledim.

https://ev3-help-online.api.education.lego.com/Education/en-gb/page.html?Path=blocks%2FLEGO%2FLED.html

Yukarıdaki bağlantıda en aşağıdaki tabloda robotun durum ışıklarının sadece Green, Orange ve Red renkleri ile ışık verebileceği yazıyor. Anladığım kadarıyla bunun dışındaki renk nitelikleri Renk sensöründe kullanılıyor. (surface yani yüzey renklerini tespit için)

Kodlarımı aşağıdaki gibi düzenleyince sorunum çözüldü

renk_listesi = [Color.ORANGE, Color.RED, Color.GREEN]

for renk in renk_listesi:
    brick.light(renk)
    wait(1000)

Uğraşan başka arkadaş varsa umarım faydalı olmuştur. Bayağı zamanımı aldı. Herkese iyi çalışmalar.

1 Like