admin tarafından yazılmış tüm yazılar

Ç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);
}
}
}

Arduino el ile uzaktan kontrollü araba

eldiven_verici_alici ares dosyaları

kutuphane dosyaları

Verici kodu:

#include <SPI.h> //nRF24L01+ ile haberleşmek için kullanılan SPI kütüphanesi
#include “RF24.h” //nRF24L01+ kütüphanesi
#include “Wire.h” //iletişim kütüphanesi
#include “I2Cdev.h” //MPU6050 ile haberleşme kütüphanesi
#include “MPU6050.h” //MPU6050 ana kütüphane

MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;

 

int data[2]; // X ve Y düzlemi için dizi tanımlama

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL; //iletişim adresi

void setup(void){
Serial.begin(9600);
Wire.begin();
mpu.initialize(); //MPU başlat
radio.begin(); //nRF24 başlat
radio.openWritingPipe(pipe); //Alıcı adresini kur
}

void loop(void){

mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

 

data[0] = map(ax, -17000, 17000, 0, 250 ); //X düzleminin verisi (ileri-geri)
data[1] = map(ay, -17000, 17000, 0, 250); //Y düzeleminin verisi (sağ-sol)
radio.write(data, sizeof(data));
}

Alıcı kodu:

#include <SPI.h> //nRF24L01+ ile haberleşmek için kullanılan SPI kütüphanesi
#include “RF24.h” //nRF24L01+ kütüphanesi

//motor enable pinleri
const int enbA = 3;
const int enbB = 5;

//motor pinleri. zıt yöne çevirmek için pin numaralarını değiştirin.
const int IN1 = 4; //Sağ Motor (-)
const int IN2 = 2; //Sağ Motor (+)
const int IN3 = 7; //Sol Motor (+)
const int IN4 = 8; //Sol Motor (-)

// X ve Y düzlemi için dizi tanımlama
int data[2];

//CE ve CSN’nin bağlı olduğu pinler
RF24 radio(9,10);

//iletişim adresi
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(){
//motor pinlerini çıkış olarak ayarla
pinMode(enbA, OUTPUT);
pinMode(enbB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);

Serial.begin(9600);
radio.begin(); //nRF24 iletişimini başlat
radio.openReadingPipe(1, pipe); //verici adresine ayarla
radio.startListening();
}

void loop(){
if (radio.available()){
radio.read(data, sizeof(data));

if(data[0] > 150){ //ileri
analogWrite(enbA, data[0]);
analogWrite(enbB, data[0]);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);

}

if(data[0] < 100){ //geri
analogWrite(enbA, data[0]);
analogWrite(enbB, data[0]);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}

if(data[1] > 150){ //sol
analogWrite(enbA, data[1]);
analogWrite(enbB, data[1]);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}

if(data[1] < 100){ //sağ
analogWrite(enbA, data[1]);
analogWrite(enbB, data[1]);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}

if(data[0] > 100 && data[0] < 150 && data[1] > 100 && data[1] < 150){
//arabayı durdur
analogWrite(enbA, 0);
analogWrite(enbB, 0);
}
}
}

Arduino gaz alarm

MQ-2_PCB_GÖRÜNÜM ares dosyası

//MQ-2 Gaz sensörünün kullanımı
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
int buzzer=7;
int led=6;
void setup() {
lcd.begin(16,2); //lcdin satır ve sütun bilgisi
pinMode(led,OUTPUT);
pinMode(buzzer,OUTPUT);
Serial.begin(9600);
}
void loop() {
int durum=analogRead(A5);
Serial.print(“Sensör durumu:”);
Serial.println(durum);
delay(500);

if(durum>=250){
lcd.setCursor(0,0);
lcd.print(” ACIL DURUM GAZ”);
lcd.setCursor(0,1); //burda gaz kokusu algılandığında uyarı vererek ekranı yarıms aniye arlıklarla kapatıp açacak
lcd.print(” **KACAGI VAR**”);
delay(500);
lcd.clear();
digitalWrite(led,HIGH);
digitalWrite(buzzer,HIGH);
delay(300); //burada gaz uyarısı vererek buzzer ve ledi aktif hale getirecektir
digitalWrite(led,LOW);
digitalWrite(buzzer,LOW);
delay(150);
}
else{
lcd.setCursor(0,0); //yazılacak satırı seçiyoruz
lcd.print(“DURUM GAYET IYI”);
lcd.setCursor(8,1); //eğer gaz kokusu olmadığında buradki komutlar çalışacak
lcd.print(“Gaz Yok”);
lcd.setCursor(0,1);
lcd.print(“=”);
lcd.print(durum);
lcd.setCursor(5,1);
lcd.print(“:)”);
digitalWrite(buzzer,LOW);
digitalWrite(led,LOW);
}
}

Arduino alkolmetre

MQ-2_5110_EKRANLI _PCB ares dosyası

kodlar:

#include <LCD5110_Graph.h> //Kütüphaneyi projeye dahil ettik.
LCD5110 myGLCD(8,9,10,11,12);
extern unsigned char TinyFont[];
extern uint8_t BigNumbers[];
int maxval = 0;
int birasayisi =0;

void setup() {
myGLCD.InitLCD();
}

void loop() {
int alkol = analogRead(A5);
int alkol_grafik = map(alkol,0,1023,2,81);

myGLCD.clrScr();
myGLCD.setFont(BigNumbers);
myGLCD.printNumI(alkol,10,10);
myGLCD.setFont(TinyFont);
myGLCD.print(“ALKOL METRE”, CENTER, 0);

cerceve(); // Progressbar çerçevesi çizdirilir.
yuzde_dolum(alkol_grafik);

if (alkol > maxval) { //Maksimum ölçüm değerini elde ediyoruz.
maxval = alkol;
}
if (maxval < 100) {
birasayisi = 0;
}
if (maxval > 100 && maxval < 160) {
birasayisi=1;
}
if (maxval > 161 && maxval < 200) {
birasayisi=2;
}
if (maxval > 201 && maxval < 230) {
birasayisi=3;
}

myGLCD.print(“MAX: “, 55, 15); // Maksimum ölçüm değerini ekrana yansıtıyoruz.
myGLCD.print(“GAZ DURUM: “, 55, 25); //Mevcut alkol ölçümünün kaç 50cl’lik biraya denk geldiğini yansıtıyoruz..
myGLCD.printNumI(maxval, 72, 15);
myGLCD.printNumI(birasayisi, 75, 25);
myGLCD.update();
delay(100);
}

void cerceve(){ //ProgressBar’ın çerçevesini çizdiriyoruz.

myGLCD.drawRect(2, 38, 81, 47);
myGLCD.update();
}

void yuzde_dolum(int yuzde){ //ProgressBar algoritması.. Aslında birbirine paralel uzayan kısalan çizgilerden ibaret…
myGLCD.drawLine(2, 39, yuzde, 39);
myGLCD.drawLine(2, 40, yuzde, 40);
myGLCD.drawLine(2, 41, yuzde, 41);
myGLCD.drawLine(2, 42, yuzde, 42);
myGLCD.drawLine(2, 43, yuzde, 43);
myGLCD.drawLine(2, 44, yuzde, 44);
myGLCD.drawLine(2, 45, yuzde, 45);
myGLCD.drawLine(2, 46, yuzde, 46);
}

Arduino sıcaklık kontrol

LM35_DEVRESİ ares dosyası

//Yasin Demir lcd termometre uygulaması
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int lm35=A7;
float voltaj_deger=0;
float sicaklik=0;
int gelen_veri=0;
int buzzer=6;
int led=8;
int role=9;
void setup() {
lcd.begin(16,2);
pinMode(buzzer,OUTPUT);
pinMode(led,OUTPUT);
pinMode(role,OUTPUT);
}
void loop() {
gelen_veri=analogRead(lm35);
voltaj_deger=(gelen_veri / 1023.0) * 5000;
sicaklik=voltaj_deger / 10.0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Sicaklik = “);
lcd.setCursor(0,1);
lcd.print(sicaklik);
lcd.print(” derece”);
delay(1000);

if(sicaklik>=28){
digitalWrite(role,HIGH);
digitalWrite(led,HIGH);
digitalWrite(buzzer,HIGH);
delay(300);
digitalWrite(led,LOW);
digitalWrite(buzzer,LOW);
delay(100);
}
else{
digitalWrite(role,LOW);
digitalWrite(buzzer,LOW);
digitalWrite(led,LOW);
}
}