Herkese merhaba:
Tatil başladığından beri araştırmalara yoğunluk verdim malum okulda zaman olmuyor. Android de bu araştırma konularının en önde gelenlerinden biriydi, hala da öyle. Bir kaç deneme uygulamam olmuştu daha önceden ama Google Play Store da bunların hiçbirini yayınlamamıştım taki bugüne kadar. Bugün ilk Android uygulamamı Google Play Store a koymuş bulunuyorum.
Programdan bahsetmek gerekise, program karmaşık sayılarda işlemler yapabiliyor ama daha çok basit oranda.
İşlemlerini gerçekleştirebiliyor. İndirilme-beğenilme sayısına göre geliştirip geliştirmemeye karar vereceğim. İndirmek isteyenler için programın linki:
Yeni uygulamam hakkında tavsiyeler ararken gerçekten çok ilginç bir site buldum ve sizinle paylaşmak istiyorum, adı appsurfer.com. Sitenin yaptığı iş sizin play store da bulunan uygulmanızı alıp internette kullanılabilir hale getiriyorlar, tabiki bende Android play store da yeni olduğum için bu siteye bir şans vermeye karar verdim. Uygulamamdan sonuç almaya başladıktan sonra bu sitenin kattıklarıyla ilgili bir yazı yazmayı düşünüyorum. Bu kadar konuşmadan sonra kendi uygulamamın widgetını vermesem olmazdı. İşte o widget:
Herkese teşekkürler yeni bir yazıda görüşmek üzere.
Bu yazıda launchpad'e bağladığımız servo motoru bilgisayarda yazacağımız küçük bir C# uygulamasıyla kontrol edeceğiz. LaunchPad için Energia idesini kullanacağım eğer ide hakkında bilgi almak istiyorsanız bir Energia hakkındaki yazıma bakmanızı tavsiye ediyorum.
İlk olarak malzeme listesine bir bakalım:
- 1 adet TI MSP430 LaunchPad
- 1 Adet Servo ( bedeki servo 9 g'lık Tower Pro mini daha büyük servo kullanacaksanız datasheete bakmanızı tavsiye ediyorum kartı yakmamak açısından)
- 15 - 20 cm kablo
- 1 adet dişi header
- 1 adet erkek header
- Lehim teli, havya vs.
İlk önce bağlantıları yapalım:
15 cmlik bir kablonun bir tarafına dişi header bir tarafına erkek header lehimleyin. Benim yaptığım aşağıdaki resimde var fakat çok çirkin oldu umarım daha iyisini yaparsınız:
Bu kabloyu aşağıdaki resme göre launchpade bağlayın. Servo motor bağlantısı modelden modele değişebilir, benim servo motorumda sarı kablo sinyal, kahverengi ground, kırmızı da VCC'yi temsil ediyor. Seri portun çalışabilmesi için RX-TX bağlantılarını Launchpadinizin içinden çıkan Meet The LaunchPad dökümanına göre yapmanız gerekmektedir.
Şimdi masaüstü uygulamasını yazalım, Visual Studio'da yeni Windows Form application açın. Açılan forma resimdeki elemanları sürükleyin, isimlerini birazdan gelecek olan koda göre düzenleyeceksiniz:
Projenin kodlarına aşağıdaki kodu veya kendiniz yazacağınız benzer bir kodu yerleştirin:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace LaunchPadSerial
{
public partial class Form1 : Form
{
SerialPort port = new SerialPort();
public Form1()
{
InitializeComponent();
button_connect.Enabled = true;
button_disconnect.Enabled = false;
this.AcceptButton = button_connect;
}
private void button_connect_Click(object sender, EventArgs e)
{
if (!port.IsOpen)
{
try
{
button_connect.Enabled = false;
button_disconnect.Enabled = true;
port.BaudRate = 9600;
port.PortName = comboBox1.SelectedItem.ToString();
this.AcceptButton = button_send;
port.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void button_disconnect_Click(object sender, EventArgs e)
{
if (port.IsOpen)
{
port.Close();
button_disconnect.Enabled = false;
button_connect.Enabled = true;
this.AcceptButton = button_connect;
}
}
private void button_send_Click(object sender, EventArgs e)
{
try
{
string str = textBox_outgoing.Text;
byte[] buffer = new byte[2];
buffer[0] = Convert.ToByte(str);
buffer[1] = 123; // closing byte
port.Write(buffer, 0, 2);
textBox_outgoing.Text = "";
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void textBox_outgoing_TextChanged(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
string[] portNames = SerialPort.GetPortNames();
comboBox1.DataSource = portNames;
}
}
}
Kodu çok basit düzeyde yazdım C#'da acemi olduğum için düzelteceğiniz veya anlaşılmayan bir yer olursa kodlarda cevaplamaktan mutluluk duyarım. Sıra geldi, launchpade yazacağımız kodu oluşturmaya. Yeni bir Energia sekmesi açın ve içine aşağıdaki kodu veya yine kendinizin yazdığı kodu kopyalayın, kodları Energia'nın öreneklerine bakarak oluşturdum bunun gibi bir kodu rahatlıkla kısa zamanda oluşturmanız mümkün:
#include <Servo.h>
int buffer[2];
boolean flag = false;
Servo servo1;
void setup() {
// initialize serial:
Serial.begin(9600);
servo1.attach(9);
}
void loop() {
if(flag == true)
{
servo1.write(buffer[0]);
}
flag = false;
delay(1000);
}
void serialEvent() {
while (Serial.available()) {
buffer[0] = (int)Serial.read();
buffer[1] = (int)Serial.read();
flag = true;
}
}
Biraz kodu anlatayım. serialEvent launchpadin Rx pinine bir data geldiğinde çalışan bir event. Onun içinde bayrağı set ediyoruz, bir data ve bir bitiş byte'ı okuyoruz. Bitiş byte'ına gerek yok fakat ben birşey denemek için oraya koymuştum daha sonrada kaldırmadım. Daha sonra flag set edilmişse buffer[0]'ı servoya gönderiyoruz. Anlaşılacağı üzere bilgisyardan göndereceğimiz veri 0 - 180 arasında olmadır, fakat program 255'e kadar izin vermektedir, eğer 255 aşılırsa hata mesajıyla karşılaşacaksınız.
Anlatacaklarım bunlardan ibaretti, umarım yardımcı olabilmişimdir. Son olarak uygulamanın videosunu yayınlayacağım:
Finaller yüzünden epey uzun zamandır kayıt gönderemiyordum fakat elime geçen ilk fırsatta araştırmalara koyuldum. Finaller sırasında sipariş ettiğim iki launchpad geldi ve onlarla oynarken epeydir merak ettiğim bir konuya daldım, Energia.
Arduinoya kod yazmanın kolaylığından önceki kayıtlarda bahsetmiştim, peki kolay kod yazmak istiyorsak fakat Arduinodan daha ucuz bir geliştime kiti bakıyorsak yada daha farklı geliştirme kitlerini denemek istiyorsak ne yapabiliriz ?
- Energia yüklememiz vede bir uyumlu geliştime kitimiz olması yeterli.
Energia, Arduino kod yapısını özellikle MSP430 LaunchPad geliştime kitine uygulayabilmeyi sağlayan bir platformdur. Energia'nın kendi örneklerinde bulnunan servo motor uygulaması aşağıdaki gibidir :
Gördüğünüz gibi çok basit şekilde TI launchpad gibi güzel bir kite Arduino kodlarını yazabiliyoruz. Tabi bu dilin Arduino için yazıldığını ve onunla daha bütünleşik olduğunu da unutmamak gerekir.
TI Launchpad mi Arduino mu ?
Bu kararı her kullanıcının kendisinin vermesi gerektiğine inanıyorum, çünkü iki platformda çok güçlü ve arkalarında çok ciddi destekler var. Fakat LaunchPad 4.30 usd iken Arduino'nun fiyatı 50 - 60 tl civarlarında, bu farkın LaunchPadi Arduino'nun iyi bir rakipi yaptığı aşikar. Ayrıca, Energia sadece MSP430 launchpade değil ayrıca Fraunchpad ve StellarPad'e de destek vermektedir.
Sonuç olarak eğer yeni bir platform arıyorsanız ve Arduino'ya kod yazmaktan hoşlanıyorsanız denemenizde fayda var.
Energia hakkında daha ayrıntılı bilgiye aşağıdaki adresten ulaşılabilir:
http://energia.nu/
Herkese merhaba;
Bu yazıda benim çok ilgimi çeken bir konuyu ele alıyoruz, DC motor sürmek. Robot denilince ilk akla gelen parçalardan biri motordur, motorlar sayesinde yaptığınız çalışmaların sonucunu yürüyen, uçan, yüzen bir aksam olarak görmek çoğu kişiyi çok heyecanlandıracaktır. Biraz nasıl yapılacağı konusunda konuşalım.
İlk olarak Arduino direk olarak motoru sürecek kadar akımı I/O pinlerinden veremez, bu yüzden kesinlikle Arduino'nun pinlerine motoru bağlamayın. Motoru sürmek için üstünden yüksek akım geçirebilen motor sürücüler kullanılır ve genelde (farklı çeşitleri de mevcuttur) PWM ile hız kontrolü yapılır. Peki PWM nedir ??
PWM (Pulse Width Modulation) gerilimi lojik 0 ile 1 arasında değişen bir kare dalgadır. Fakat bu dalganın lojik birde kalma süresi ayarlanabilir olduğu için program içinde dinamik olarak bu dalganın ortalama değerini değiştirebiliriz. Arduino'daki PWM 8 bit çözünürlüktedir, 0 - 256 arası değer alır. Teori kısmı daha çok genişletilebilir ama ben burada keserek uygulama kısmına geçmek istiyorum.
Malzeme seçimi kişiden kişiye farklılık gösterebilir. Ben Tb6612fng motor sürücüsünü kullanacağım, fakat siz değişik motor sürüceleri seçebilirsiniz (l298, l293 vb.). Motor sürücünün özelliklerine biraz bakarsak çift kanal paralel olarak motor sürebilir, kanal başına 1 A'lık direnci vardır. Ben bu uygulamada pololu firmasının ürettiği carrier modülünü kullacağım. Dc motoru 1 A'den daha fazla akım çekecek bir model seçerseniz, bir süre sonra sürücüyü kaybedersiniz o yüzden motor seçimini iyi yapmalıyız.
TB6612FNG bacak bağlantıları tek motor için :
GND - grounda
VCC - 5V'a
AO1 - Bu pini motorun bir ucuna
AO2 -Bu pin motorun diğer bacağına
VMOT- motoru besleyeceğiniz güç kaynağına(9v,12v vs.)
GND- motoru beslediğiniz güç kaynağının ground'una
Ain1 - arduinonun 4. digital pinine
Ain2 - arduinonun 3. digital pinine
PWMA - arduinonun 5. digital pinine
STBY - arduinonun 2. digital pinine bağlayın.
Artık koda geçebiliriz :
code:
int pwmPin = 5;
int ain_one = 4;
int ain_ two = 3;
int stby = 2;
int i = 0;
void setup()
{
pinMode(pwmPin,OUTPUT);
pinMode(ain_one,OUTPUT);
pinMode(ain_two,OUTPUT);
pinMode(stby,OUTPUT);
// motor sürücüyü aktif ediyoruz
digitalWrite(stby,HIGH);
// motorun ileri gitmesi için in1'e 1 in2'ye 0 veriyoruz. Ters yön için tam tersini yapmanız yeterlidir.
digitalWrite(ain_one,HIGH);
digitalWrite(ain_two,HIGH);
}
void loop()
{
// motoru yavaş yavaş hızlandıran bir uygulama yapalım
for(i=0;i<255;i = i+5)
{
// pwmi motor sürücüsüne gönderiyoruz
analogWrite(pwmPin,i);
delay(10);
}
}
Eğer Arduno Unonuz varsa kodu atıp sorunsuz şekilde çalıştırabilirsiniz. Uygulamayı potansiyometreden değer okuyup motorun hızını ona göre ayarlamak gibi farklı şekillerde geliştirebilirsiniz artık orası hayal gücünüze kalmış. Sorularınız olursa cevaplamaya çalışacağım. Başka bir yazıda görüşmek üzere.
Herkese merhaba;
Arduino'ya olan ilgi her geçen gün artıyor, çünkü hobi elektroniği ile uğraşanlar insanlara kod yazımında ve çevre birim bağlantılarında çok büyük kolaylıklar sağlıyor. İnsanları hazıra alıştırıyor mu ? Orası tartışmaya açık, bir taraftan insanları datasheetleri okumaktan uzaklaştırırken bir taraftan da elektroniğe, robotiğe ilgi duyan insanların işlerini kolaylaştırarak ilgilendikleri alanlarda çok kolay bir şekilde yol almalarını sağlıyor. Biraz Arduino'yu tartıştığımıza göre bugünün konusu ADC'ye biraz değinelim. ADC (Analog to Digital Converter) yani analog sinyali digital(binary) bir sayıya dönüştüren kısımdır. Arduino'daki ADC 10 bit çözünürlüktedir yani VCC Arduino'da 5v olduğuna göre 5voltu 1023'e, 0voltu 0'a çevirecektir. Kısacası 5 voltu 1024 parçaya böler ve karşılık gelen voltaja o sayıyı atar (2.5 v yaklaşık 512 gibi bir değer alacaktır.).
ADC Arduino'da analog yazan pinlerdedir. Bu uygulamamız da basit olarak bir pot kullanarak voltage divider yapacağız ve böldüğümüz voltajı ADC modülü ile okuyup serial porttan ekrana basacağız ve aldığımız değerin büyüklüğüne göre 3 tane ledi yakacağız. Potansiyometrenin bağlantıları aşağıda anlattığım gibi yapalım.
potansiyometrenin bir ilk bacağını Arduino'nun VCC'sine,
potansiyometrennin orta bacağını analog 0 pinine,
potansiyometrenin son bacağını Arduino'nun GND'sine bağlayın.
3 tane 330 ohmluk direncin ilk bacaklarını sırasıyla digital pin 2,3,4'e bağlıyoruz ve diğer bacaklarını ledlere bağlayıp ledin diğer bacağını topraklıyoruz.
Malzemeler :
- 3 adet led
- 3 adet 330 ohm direnç
- 1 adet 4.7k pot
- Arduino
- Bilgisayar
Aşağıda uygulama için gerecek olan kodlar mevcuttur.
code:
int sensorInput = 0;
int led_bir = 2;
int led_iki = 3;
int led_uc = 4;
void setup()
{
// 9600 baudrate'te serialı başlatalım
serial.begin(9600);
// ledlerin bağlı olduğu pinleri çıkış olarak tanımalayalım
PinMode(led_bir,OUTPUT);
PinMode(led_iki,OUTPUT);
PinMode(led_uc,OUTPUT);
}
void loop()
{
// değişkenin içine ADC'den aldığımız değeri attık
sensorInput = analogRead(0);
// seri porttan sensor değerini yazdırıyoruz
serial.println(itoa(sensorInput));
// ledleri değere göre yakalım
if(sensorInput < 300 )
{
digitalWrite(led_bir,HIGH);
digitalWrite(led_iki,LOW);
digitalWrite(led_uc,LOW);
}
else if(sensorInput >= 300)
{
digitalWrite(led_bir,HIGH);
digitalWrite(led_iki,HIGH);
digitalWrite(led_uc,LOW);
}
else
{
digitalWrite(led_bir,HIGH);
digitalWrite(led_iki,HIGH);
digitalWrite(led_uc,HIGH);
}
// serial portta aksaklık yaşamamak için 5 ms'lik delay koyuyoruz
delay(5);
}
Kodlar daha çok basit ve kolay anlaşılır olduğunu düşünüyorum, arduino'nun kendi derleyecisinin içindeki serial monitor'u kullanabilirsiniz. Kodu arduino'ya atıp seri monitoru açarsanız değerlerin geldiğini göreceksiniz. Kodlarla, uygulamayla veya başkabir konuda sorularınız olursa cevaplamaya çalışırım.
Bu yazımda QTR-8RC reflektans sensörü incelemesini yapacağım ve onun devrede nasıl kullanıldığını anlatacağım.
İlk önce sensörü inceleyelim:
Pololu firması bu sensörleri QTR-8x olarak satmaktadır. Sondaki "x" rc veya a olabilmektedir. QTR-8A analog çıkış veriyor ve bir 8 kanal ADC ile rahatlıkla okunabilir. Konumuz olan QTR-8RC ise digital çıkış vermektedir. Bu sensörler ağırlıklı olarak çizgi izleyen robot projelerinde kullanılıyor ama siz farklı uygulamalar yapabilirsiniz tabiki, hayal gücünün ve yapılabileceklerin sınırı yok.
Okumak biraz karışık. Bu sensörde digital çıkışın HIGH leveldan LOW levela geçme süresini ölçerek karşısında bir cisim olup olmadığını anlayabiliyoruz, bunu da içindeki bir 10 nF lik kondansatör ile yapıyoruz ama bu kısma pek değinmiyorum. Yöntem aslında çok basit ama yeni başlayan birinin aklı karışabilir. Artık biraz uygulama yapalım.
Toplamda 11 bağlantı var. Biri GND, biri VCC, biri LED ON ve 8 tane sensör çıktısı. GND ve VCC'yi bağlayın 3.3V veya 5V ile beslenebiliyor. LED ON tasarruf için yapılmış, eğer uygulamanızda sensörü kullanmadığınız anlar var ise o zaman LED ON pinini GND yapıp ledleri kapatmak mümkün fakat hiç bağlamayadabilirisiniz, zaten bu pin devrede kendiliğinden HIGH durumdadır. Sensör çıkışlarını mcu'nun diğital pinlerine bağlayın, bağlantı işlemi bu kadar.
Gelelim kodlama kısmına. Ben kodları pseudo kod olarak yazacağım ve kolaylıkla anlayacaksınız zaten zor değil. Bu kodlarda 0'dan 7'ye kadar hayali pin numarası verdim sensörlerden gelen pinlerin bunlara bağlı olduğunu varsayıyorum.
Kod:
while(1) // sonsuz döngü açıyoruz
{
DigitalOutput(Pin0,Pin1,Pin2,Pin3,Pin4,Pin5,Pin6,Pin7); // Pinlerin hepsini output yapıyoruz.
DigitalHIGH(Pin0,Pin1,Pin2,Pin3,Pin4,Pin5,Pin6,Pin7); // Bütün pinleri HIGH yapıyoruz.
Delay_us(10); // 10 mikro saniye sensörün kapasitörünün dolmasını bekliyoruz.
DigitalInput( Pin0,Pin1,Pin2,Pin3,Pin4,Pin5,Pin6,Pin7); // Pinlerin hepisni input yapıyoruz.
Delay_ms(20); // 20 milisaniye bekliyoruz bu kısım tecrübeyle ve deneme yanılma ile oluyor. 20'yi test //ederek geliştirebilirsiniz.
for(int i=0; i<8; i++)
{
// Bu döngüde tek tek pinlere bakıyoruz eğer pin HIGH ise yansıma yok demektir.
// Eğer LOW ise yansımayı yani beyaz cismi algıladınız demektir.
if(Pin(i) == 0)
{
// Bu kısımda yapılacaklar size kalmış.
...
}
}
}
Kod kısmını böylelikle tamamlamış olduk. Tabiki bu en basit hali, siz çok daha ileriye götürebilirsiniz delay süreleriyle veya looplarla oynayarak.
Böylelikle de yazının sonuna geldik. Şu an bir video koyamıyorum ama ilerleyen günlerde video çekip koymaya çalışacağım. Umarım bu sensörlerle çalışacak olan arkadaşlara yardımcı olmuşumdur.
Bu yazıda çok basit bir kelime arayıcısı yapacağız. Ben de C# ile yeni haşır neşir olduğumdan hatalarımı mazur görün :) İşlev olarak biz istediğimiz kelimeleri ve arama yapmak istediğimiz siteleri gireceğiz eğer o sitede kelimelerimizden (Keywords) biri varsa default tarayıcıda bu siteyi açacağız.
Genel olarak Gui görüntüsü: Guide 2 label, 2 richtextbox ve 1 button bulunuyor.
Seek işlemini bir methodda gerçekleştirdim. Method argument olarak string vede string array alıyor. string seeked web sitesi içeriğini taşıyor ve string[] keyword de anahtar kelimelerimizi. Kodlar çok basit olduğu için aşağıda paylaşıyorum.
public bool seek(string[] Keywords,string Seeked)
{
string lower = Seeked.ToLower();
bool result = false;
for (int i = 0; i < Keywords.Length; i++)
{
if (lower.IndexOf(Keywords[i]) > 0)
{
result = true;
}
}
return result;
}
Buradan sonra Guideki buttonun click eventinin içine gerekli kodları yazmak kaldı. Benim buradaki taktiğim internette çok yaygın kullanılan web sitesi içeriğini bir sitringe atma ve onun içinde aramak oldu.
Process.Start(); komutunda benim default tarayıcım chrome olduğu için chrome'u çalıştırıyor.
Bu yazımın sonuna geldim umarım yararlı bilgiler bulursunuz. Eksik bulduğunuz, açıklamamı istediğimiz noktaları ve önerilerinizi yorum olarak yazarsanız çok sevinirim. İyi günler...