Kategori arşivi: Genel

Arduino Uno shield

Kodlar:

//Yasin Demir (Shield/Kodu)
#include <Servo.h>
Servo motor;
String data;
const int trig=6;
const int echo=7;
int mesafe; //Pinler arduinoya tanıtıldı.
int sure;
int role6=11;
int role5=12;
int buzzer=10;
int led_3=8;
int led_2=9;
int led_1=5;
int servo=4;
void setup() {
motor.attach(servo);
pinMode(servo,OUTPUT); //motor 4 nolu pine bağlı
pinMode(trig , OUTPUT);
pinMode(echo , INPUT);
pinMode(led_1,OUTPUT);
pinMode(led_2,OUTPUT);
pinMode(led_3,OUTPUT);
pinMode(buzzer,OUTPUT);

digitalWrite(led_1,LOW);
digitalWrite(led_2,LOW);
digitalWrite(led_3,LOW);
digitalWrite(buzzer,LOW);
Serial.begin(9600);
}
void loop() {
digitalWrite(trig,1);
delay(1000); //burada mesafe sensörünün 2 yerıinden birine 1(+5v) 1sn’ye aralıklarla gidecek.
digitalWrite(trig,0);

sure=pulseIn(echo,HIGH); //sure diye değişkenin içine Hcrs-04 ün içindekiler yazılır.
mesafe=(sure/2)/29.1;

Serial.print(“mesafe=”);
Serial.println(mesafe);

if(mesafe<=10){
digitalWrite(led_1,1);
digitalWrite(buzzer,1);
delay(50);
digitalWrite(led_1,0);
digitalWrite(buzzer,0);
delay(50);
}
else if(mesafe<=20){
digitalWrite(led_1,1);
digitalWrite(buzzer,1);
delay(125);
digitalWrite(led_1,0);
digitalWrite(buzzer,0);
delay(125);
}
else if(mesafe<=15){
digitalWrite(led_1,1);
digitalWrite(buzzer,1);
delay(90);
digitalWrite(led_1,0);
digitalWrite(buzzer,0);
delay(90);
}
else if(mesafe<=5){
digitalWrite(buzzer,1);
delay(50);
digitalWrite(led_1,1);
delay(15);
digitalWrite(led_1,0);
delay(15);
}
else if(mesafe<=3){
digitalWrite(buzzer,1);
digitalWrite(led_1,1);
delay(10);
digitalWrite(led_1,0);
delay(10);
}
else{
digitalWrite(buzzer,0);
digitalWrite(led_1,0);
}

while(Serial.available())
{
delay(10);
data += char(Serial.read());
}
if(data.length() >0) {
Serial.println(data);

if(data == “led1_kapa”) {digitalWrite(led_1,LOW);}
if(data == “led1_ac”) {digitalWrite(led_1,HIGH);}

if(data == “led1_kapa”) {digitalWrite(led_2,LOW);}
if(data == “led1_ac”) {digitalWrite(led_2,HIGH);}

if(data == “led1_kapa”) {digitalWrite(led_3,LOW);}
if(data == “led1_ac”) {digitalWrite(led_3,HIGH);}

if(data == “buzzer_ac”) {digitalWrite(buzzer,LOW);}
if(data == “buzzer_kapa”) {digitalWrite(buzzer,HIGH);}

if(data == “servo”){
motor.write(180);
}
if(data == “servo”) {
motor.write(0);
}
if(data == “hepsi_ac”){
digitalWrite(led_1,HIGH);
digitalWrite(led_2,HIGH);
digitalWrite(led_3,HIGH);
digitalWrite(buzzer,HIGH);}

if(data == “hepsi_kapat”){
digitalWrite(led_1,LOW);
digitalWrite(led_2,LOW);
digitalWrite(led_3,LOW);
digitalWrite(buzzer,LOW);}
data = “”;
}
}

proto_shiedl ares dosyası

Çizgi izleyen robot (PCB gövde)

Çizgi izleyen robot kodu:

#include <QTRSensors.h>

//pinleri tanımla

#define AIN1 4 //A sağ motor
#define AIN2 3
#define PWMA 5

#define PWMB 6 //B sol motor
#define BIN1 7
#define BIN2 8
#define STBY 9

#define sensorSayisi 8
#define sensorOrnekSayisi 4
#define emiterPini 11
#define LED 13
#define MZ80 2

//hız ayarı
int maxhiz = 70;

boolean zemin=1; //1 siyah 0 beyaz

//PD’yi kullanmak için değişkenleri bildirme
int hata = 0; float KP=0.01; // hata
int turev = 0; float KD=0.1; // turev

unsigned int pozisyon = 0;

int fark = 0; // motorlara uygulanan fark
int son_hata; // Orantılı son değer (hatanın türevini hesaplamak için kullanılır)
int hedef = 3500; // Ayar noktası (8 sensör kullandığımız için pozisyon 0 ile 7000 arasında olmalıdır, bu yüzden ideal 3500)

//QTR-8A ayarla
QTRSensorsAnalog qtra((unsigned char[]){A0, A1, A2, A3, A4, A5, A6, A7},sensorSayisi);

unsigned int sensor[sensorSayisi];

void setup()
{
// çıkış pinleri
pinMode(AIN1 ,OUTPUT);
pinMode(AIN2 ,OUTPUT);
pinMode(PWMA ,OUTPUT);
pinMode(BIN1 ,OUTPUT);
pinMode(BIN2 ,OUTPUT);
pinMode(PWMB ,OUTPUT);
pinMode(LED ,OUTPUT);
pinMode(STBY ,OUTPUT);
pinMode(MZ80 ,INPUT);

// Dahili Led yanıp söndüğü sürece (3sn) Elle Kalibrasyon yap
for ( int i=0; i<70; i++)
{
digitalWrite(LED, HIGH); delay(20);
qtra.calibrate();
digitalWrite(LED, LOW); delay(20);
}

}

void loop()
{

pozisyon = qtra.readLine(sensor, true, zemin);
hata = pozisyon – hedef;

turev = hata – son_hata;

son_hata = hata;

int fark = ( hata * KP) + ( turev * KD );

if ( fark > maxhiz ) fark = maxhiz;
else if ( fark < -maxhiz ) fark = -maxhiz;

( fark < 0 ) ?
motor(maxhiz, maxhiz+fark) : motor(maxhiz-fark, maxhiz);
}

// sağ motor sürücü fonksiyonu
void sagmotor(int deger)
{
if ( deger >= 0 )
{
digitalWrite(AIN1,HIGH);
digitalWrite(AIN2,LOW);
}
else
{
digitalWrite(AIN1,LOW);
digitalWrite(AIN2,HIGH);
deger *= -1;
}
analogWrite(PWMA,deger);
}

// sol motor sürücü fonksiyonu
void solmotor(int deger)
{
if ( deger >= 0 )
{
digitalWrite(BIN1,HIGH);
digitalWrite(BIN2,LOW);
}
else
{
digitalWrite(BIN1,LOW);
digitalWrite(BIN2,HIGH);
deger *= -1;
}
analogWrite(PWMB,deger);
}

//motor sürücü
void motor(int sol, int sag)
{
digitalWrite(STBY,HIGH);
solmotor(sol);
sagmotor(sag);
}

qtr-sensors-arduino-3.0.0 kütüphane dosyası

QTR-8x datasheet

QTR_arduino_library

Hızlı Çizgi izleyen robot (PCB gövde)

araba_hizli proteus dosyası

Arduino denge robotu

kod:

#include <PID_v1.h>
#include <LMotorController.h>
#include “I2Cdev.h”
#include “MPU6050_6Axis_MotionApps20.h”

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include “Wire.h”
#endif

#define MIN_ABS_SPEED 30

MPU6050 mpu;

// MPU kontrol ve durum değişkenleri
bool dmpReady = true; // DMP başarılıysa true yap
uint8_t mpuIntStatus; // MPU interrupt durumunu tutar
uint8_t devStatus; // işlem sonrası durum (0 = başarılı, !0 = hata)
uint16_t packetSize; // DMP paketi boyutu (varsayılan değer 42 byte)
uint16_t fifoCount; // FIFO anlık byte sayısı
uint8_t fifoBuffer[64]; // FIFO saklama

// yönlendirme ve hareket değişkenleri
Quaternion q; // [w, x, y, z] kuaternion (dördey) konteyneri
VectorFloat gravity; // [x, y, z] yerçekimi vektörü
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll konteyneri ve yerçekimi vektörü

//PID
double originalSetpoint = 178;
double setpoint = originalSetpoint;
double movingAngleOffset = 0.08;
double input, output;

//bu değerleri kendi tasarımınıza uyacak şekilde ayarlayın
double Kp = 85;
double Kd = 2.5;
double Ki = 290;
PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);

double motorSpeedFactorLeft = 0.8;
double motorSpeedFactorRight = 0.6;

//motor bağlantıları
int ENA = 5;
int IN1 = 7;
int IN2 = 6;
int IN3 = 8;
int IN4 = 9;
int ENB = 10;
LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight);

volatile bool mpuInterrupt = false; // MPU kesme pininin yüksek olup olmadığını gösterir.
void dmpDataReady()
{
mpuInterrupt = true;
}

void setup()
{
// I2C veri yolu (I2Cdev kütüphanesi bunu otomatik olarak yapmaz)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 24; // 400kHz I2C clock (eğer CPU 8MHz ise 200kHz)
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif

mpu.initialize();

devStatus = mpu.dmpInitialize();

// kendi gyro değerlerinizi buradan girin
mpu.setXGyroOffset(200);
mpu.setYGyroOffset(85);
mpu.setZGyroOffset(-65);
mpu.setZAccelOffset(1750);

// Çalıştığından emin olun (eğer öyleyse 0 değerini döndürür)
if (devStatus == 0)
{
// DMP’yi aç
mpu.setDMPEnabled(true);

// Arduino interrupt etkinleştir
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();

dmpReady = true;

// Daha sonra karşılaştırma için beklenen DMP paket boyutu
packetSize = mpu.dmpGetFIFOPacketSize();

//setup PID
pid.SetMode(AUTOMATIC);
pid.SetSampleTime(10);
pid.SetOutputLimits(-255, 255);
}
else
{
// hata!
// 1 = başlangıç bellek yükü başarısız oldu
// 2 = DMP yapılandırma güncellemeleri başarısız oldu
// (durursa, genellikle kod 1 olacak)
Serial.print(F(“DMP başlatma başarısız oldu (kod”));
Serial.print(devStatus);
Serial.println(F(“)”));
}
}

void loop()
{
// programlama başarısız olursa, hiçbir şey yapma
if (!dmpReady) return;

// MPU interrupt veya ekstra paket için bekle
while (!mpuInterrupt && fifoCount < packetSize)
{
//Mpu verisi yok – PID hesapla ve motorları sür
pid.Compute();
motorController.move(output, MIN_ABS_SPEED);

}

// kesme bayrağını sıfırla ve INT_STATUS baytını al
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();

// mevcut FIFO sayısını al
fifoCount = mpu.getFIFOCount();

// taşma olup olmadığını kontrol et
if ((mpuIntStatus & 0x10) || fifoCount == 1024)
{
// resetle, böylece temiz bir şekilde devam edebiliriz
mpu.resetFIFO();
Serial.println(F(“FIFO taştı!”));

// DMP interrupt’ını kontrol edin (bu sık sık yapılmalıdır)
}
else if (mpuIntStatus & 0x02)
{
// Doğru kullanılabilir veri uzunluğunu bekle
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

// FIFO’dan paket oku
mpu.getFIFOBytes(fifoBuffer, packetSize);

// paketin > 1 olması halinde FIFO sayısını buradan takip edin
// (interrupt beklemeden hemen okuyabilmemizi sağlar.)
fifoCount -= packetSize;

mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
input = ypr[1] * 180/M_PI + 180;
}
}

 

Arduino uzaktan kumandalı araba

Joystick_araba ares dosyaları

kutuphane dosyaları

joystick kod:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

 

#define CE_PIN 9
#define CSN_PIN 10
#define x_axis A1 // x axis
#define y_axis A0 //y axis

 

 

const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int data[2];

void setup()
{
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}

void loop()
{

data[0] = analogRead(x_axis);
data[1] = analogRead(y_axis);
radio.write( data, sizeof(data) );

//HATA AYIKLAMA (DEBUG)
Serial.print(analogRead(x_axis));
Serial.println(” “);
Serial.print(analogRead(A1));
Serial.println(” “);
//Serial.print(digitalRead(BUTON));
}

araba kod:

//Yasin Demir Joystick_kontrollü_araba
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int data[2];
int in1 = 6; //Sağ Motor
int in2 = 7;
int in3 = 2; //Sol Motor
int in4 = 4;
int sag_PWM = 5;
int sol_PWM = 3;
void setup()
{
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(sag_PWM, OUTPUT);
pinMode(sol_PWM, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();;
}

 

void loop() {
if ( radio.available() ) //Eğer sinyal algılarsan.
{
int y = data[1];
int x = data[0];
radio.read( data, sizeof(data) );
if (y >= 400 && y <= 600) { //DUR
digitalWrite(in1 , LOW);
digitalWrite(in2 , LOW);
digitalWrite(in3 , LOW);
digitalWrite(in4 , LOW);
analogWrite(sag_PWM, 0);
analogWrite(sol_PWM, 0);
}
if (y >= 800 && y <= 1023) { //İLERİ
digitalWrite(in1 , LOW);
digitalWrite(in2 , HIGH);
digitalWrite(in3 , LOW);
digitalWrite(in4 , HIGH);
analogWrite(sag_PWM, 185);
analogWrite(sol_PWM, 185);
}
if (y >= 0 && y <= 450) { //GERİ
digitalWrite(in1 , HIGH);
digitalWrite(in2 , LOW);
digitalWrite(in3 , HIGH);
digitalWrite(in4 , LOW);
analogWrite(sag_PWM, 185);
analogWrite(sol_PWM, 185);
}
if (x >= 0 && x <= 450) { //SOL_İLERİ
digitalWrite(in1 , LOW);
digitalWrite(in2 , HIGH);
digitalWrite(in3 , LOW);
digitalWrite(in4 , HIGH);
analogWrite(sag_PWM, 225);
analogWrite(sol_PWM, 100);
}
if (x >= 600 && x <= 1023) { //SAĞ_İlERİ
digitalWrite(in1 , LOW);
digitalWrite(in2 , HIGH);
digitalWrite(in3 , LOW);
digitalWrite(in4 , HIGH);
analogWrite(sag_PWM, 100);
analogWrite(sol_PWM, 190);
}
}
}