İçerik Tablosu
PicoBricks ile sınırsız hayal gücünün kapılarını aralayabilirsiniz. Bu olağanüstü araç ile yaratıcılığınızın sınırlarını zorlayarak çeşitli oyunlar yaratabilirsiniz. Örneğin, labirent oyunları oluşturmak oldukça keyifli bir deneyim sunar. Yeni PicoBricks sürümü ile bu oyunları uzaktan kumanda ile kontrol etme imkanına da sahipsiniz!
Labirent oyununu anlatırken, oyuncuların topun hareketini uzaktan kumanda veya benzeri bir cihazla kontrol edebildiğini ve amacın bir deliğe veya hedef noktasına ulaşmak olduğunu vurgulamalıyız. Labirent içinde yol alırken, oyuncular topun dengesini korumalı ve engelleri aşmalıdır. Tüm bunları yaparken, topu ustalıkla hedefe yönlendirmeye çalışırlar. Labirent oyunu, oyuncuların tamamen içine çeken, el-göz koordinasyonunu gerektiren ve sabır ile odaklanmayı gerektiren bir deneyim sunar.
Detaylar ve Algoritma
"PicoBricks ve bir IR alıcı kullanarak servo motor üzerinde kablosuz kontrol sağlayan labirent oyunumuzu özenle tasarladık. Programımız, bir IR uzaktan kumanda tarafından gönderilen sinyalleri algılamak için tasarlandı ve bu sinyallere dayanarak servo motorun çeşitli hareketleri, örneğin yukarı, aşağı, sola, sağa hareket etmesi veya durmasını sağlayacak şekilde komutlar veriyor.
Servo motorun açılarını dikkatlice hesapladık ve bunları PWM (Pulse Width Modulation - Darbe Genişlik Modülasyonu) sinyali kullanarak kesin pozisyonlara dönüştürdük. Programımız, otomasyon projeleri ve uzaktan kontrol edilen cihazlar için temel bir örnek olarak hizmet ederken, aynı zamanda bir 3D yazıcı aracılığıyla üretilen mekanik bir tasarımı da içeriyor. İlgilenenler, kodun işlevselliğini derinlemesine anlamak ve benzer projeler için kullanmak üzere koda göz atabilirler.
İsterseniz, kendi labirent oyununuzu yaratıp 3D yazıcınızda basabilir, ya da aşağıdaki indirme butonunu kullanarak STL dosyasını indirip 3D yazıcınızda basabilirsiniz."
Picobricks IDE Kodları
MicroBlocks Kodları
MicroPython Kodları
MicroPython kodu aşağıda gösterilmiştir. Kodlama yaparken, servo motorların farklı şekillerde bağlanmış olabileceğini unutmayın ve bu nedenle "degree" ve "degree2" değerlerini uygun şekilde ayarlayın.
from time import sleep
from machine import Pin
from picobricks import NEC_16
from picobricks import IR_RX
from machine import PWM
from math import fabs
def ir_callback(data, addr, ctrl):
global ir_data
global ir_addr, data_rcvd
if data > 0:
ir_data = data
ir_addr = addr
print('Data {:02x} Addr {:04x}'.format(data, addr))
data_rcvd = True
ir = NEC_16(Pin(0, Pin.IN), ir_callback)
ir_data = 0
data_rcvd = False
pwm_2 = PWM(Pin(22))
pwm_2.freq(50)
def CalculateAngle(angle):
angle = fabs((angle * (6000 / 180)) + 2000)
angle = round(angle)
return angle
def up():
global dare_question_long, blank, degree, degree2, i
for count in range((8)):
degree += 2
pwm_2.duty_u16(CalculateAngle(degree))
pwm_1 = PWM(Pin(21))
pwm_1.freq(50)
def left():
global dare_question_long, blank, degree, degree2, i
for count in range((8)):
degree2 += 2
pwm_1.duty_u16(CalculateAngle(degree2))
def down():
global dare_question_long, blank, degree, degree2, i
for count in range((8)):
degree -= 2
pwm_2.duty_u16(CalculateAngle(degree))
def right():
global dare_question_long, blank, degree, degree2, i
for count in range((8)):
degree2 -= 2
pwm_1.duty_u16(CalculateAngle(degree2))
def stop():
global dare_question_long, blank, degree, degree2, i
degree = 0
degree2 = 0
pwm_1.duty_u16(CalculateAngle(degree))
pwm_2.duty_u16(CalculateAngle(degree2))
degree = 60
degree2 = 60
i = 0
while True:
if data_rcvd == True:
data_rcvd = False
if ir_data == IR_RX.number_up:
up()
elif ir_data == IR_RX.number_down:
down()
elif ir_data == IR_RX.number_left:
left()
elif ir_data == IR_RX.number_right:
right()
elif ir_data == IR_RX.number_ok:
stop()
Arduino C Kodları
#include <Wire.h>
#include <DHT.h>
#include "ACROBOTIC_SSD1306.h"
#include <IRremote.h>
#include <IRremote.hpp>
#include <Servo.h>
#define IR_RECEIVE_PIN 0
Servo servo1;
Servo servo2;
int angle1, angle2;
void servoBalance(){
angle1 = 90; // set the horizontal plane angle
angle2 = 90;
setServoAngle();
}
void setServoAngle(){
servo1.write(angle1);
servo2.write(angle2);
}
void setup() {
Serial.begin(9600);
Wire.begin();
oled.init();
oled.clearDisplay();
pinMode(0,INPUT);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
servo1.attach(21);
servo2.attach(22);
servoBalance();
}
void loop() {
setServoAngle();
delay(500);
if (IrReceiver.decode()) {
int a = (IrReceiver.decodedIRData.decodedRawData);
Serial.println(a);
IrReceiver.resume(); // Receive the next value
if(a == -417792256){
angle2+=30;
}else if (a == -1387069696){
angle2-=30;
}else if (a == -150405376){
angle1-=30;
}else if (a == -1520763136){
angle1+=30;
}else if (a == -484638976){
servoBalance();
}
}
}