Mesajlar Etiketlendi ‘Arduino’

DHT-22 Nem/sıcaklık sensörü ile yapılmış basit bir izleme/alarm devresi. Devrede ESP8266 WiFi modül ve 3 adet (istenirse arttırılabilir) DHT-22 sensor kullanıldı.

IMG_20190306_181849
Devre çalıştırıldığında wifi modeminize (veya AP) bağlanıyor. Programı yüklerken statik IP verebilir veya modem üzerinden cihazın aldığı IP’yi görebilirsiniz. Tarayıcıya bu IP adresini girdiğinizde, bağlı sensörlerin değerlerini görebiliyorsunuz. Ayrıca yine wifi üzerinden modüle bağlanıp değerleri alan bir windows yazılımı da var. bu yazılımda,
sıcaklık ve nem için alarm limiti tanımlayabiliyorsunuz.

Untitled-1

Untitled-2

web server tarafını isteğinize göre değiştirmek, görsel olarak zenginleştirmek mümkün.
Ben NodeMCU (ESP12E) kullanıyorum. Bağlantı şemasını nette kolaylıkla bulabilirsiniz.
DHT-22 sensörleri aşağıdaki gibi kullandım.

Untitled-3

Sensörlerin 3 ve 4 pinli olmak üzere 2 çeşidi var. Ben 4 pinli kullandım.
Sensörlerin data uçlarını 10k direnç ile Vcc’ye (3.3v) çektim.

Yapmak isterseniz, kodu sayfa sonunda bulabilirsiniz. Arduino’ya gerekli kütüphaneleri
kurarak kolayca derleyebilir ve yükleyebilirsiniz.

*************************************************************************************
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include “DHTesp.h”
int stLed = D2;
// config: ////////////////////////////////////////////////////////////

#define UART_BAUD 9600
#define packTimeout 5 //ms
#define bufferSize 8192

// For STATION mode:
const char *ssid = “SSID”;
const char *pw = “pass”;
const char* host = “sky_TempServer”;

const int port = 9876;
boolean tcpconn = false;

//////////////////////////////////////////////////////////////////////////

WiFiServer server(port); //9876
WiFiClient client;

char charT1[5];
char charH1[5];
char charT2[5];
char charH2[5];
char charT3[5];
char charH3[5];

int sayac = 0;
float temperature1, temperature2, temperature3;
float humidity1, humidity2, humidity3;

//String stringVal = “”;
//uint8_t buf1[bufferSize];
//uint8_t i1=0;

ESP8266WebServer wserver(80);

DHTesp dht1, dht2, dht3;

void setup() {
pinMode(BUILTIN_LED, OUTPUT);
pinMode(stLed, OUTPUT);

digitalWrite(BUILTIN_LED, HIGH);
digitalWrite(stLed, LOW);

Serial.begin(UART_BAUD);

Serial.println(“WiFi bekleniyor…”);
WiFi.forceSleepWake();

WiFi.setAutoConnect(false);
WiFi.hostname(host);
WiFi.mode(WIFI_STA);
//static IP
//IPAddress ip(192, 168, 1, 5);
//IPAddress dns(192, 168, 1, 1);
//IPAddress gateway(192, 168, 1, 1);
//IPAddress subnet(255, 255, 255, 0);
//WiFi.config(ip, dns, gateway, subnet);

delay(500);

WiFi.begin(ssid, pw);

wserver.on(“/”, handle_OnConnect);
wserver.onNotFound(handle_NotFound);

dht1.setup(D1, DHTesp::DHT22); //GPIO05
dht2.setup(D2, DHTesp::DHT22); //GPIO06
dht3.setup(D4, DHTesp::DHT22); //GPIO02
}
void loop() {
wserver.handleClient();

while (WiFi.status() != WL_CONNECTED) {
digitalWrite(stLed, LOW);
digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED));
delay(100);
if(WiFi.status() == WL_CONNECTED) {
digitalWrite(BUILTIN_LED, HIGH); //wifi connected

Serial.println(“WiFi connected”);
Serial.print(“IP address: “);
Serial.println(WiFi.localIP());

long rssi = WiFi.RSSI();
Serial.print(“RSSI:”);
Serial.println(rssi);

server.begin(); // start TCP server
Serial.println(“Starting TCP Server”);

wserver.begin();
Serial.println(“Starting HTTP server”);
}
}

if(!client.connected()) { // if client not connected
if (tcpconn) {
Serial.println(“disconnected”);
}

tcpconn = false;
client = server.available(); // wait for it to connect
}
if(client.connected()) {
if (!tcpconn) {
Serial.print(client.remoteIP());
Serial.println(” connected”);
tcpconn = true;
}

// now send to WiFi

client.write(“{“);
client.write(“|”);
client.write((char*)charT1, 5);
client.write(“|”);
client.write((char*)charH1, 5);
client.write(“|”);
client.write((char*)charT2, 5);
client.write(“|”);
client.write((char*)charH2, 5);
client.write(“|”);
client.write((char*)charT3, 5);
client.write(“|”);
client.write((char*)charH3, 5);
client.write(“|”);
client.write(“}”);
}

delay(dht1.getMinimumSamplingPeriod());
humidity1 = dht1.getHumidity();
temperature1 = dht1.getTemperature();

delay(dht2.getMinimumSamplingPeriod());
humidity2 = dht2.getHumidity();
temperature2 = dht2.getTemperature();

delay(dht3.getMinimumSamplingPeriod());
humidity3 = dht3.getHumidity();
temperature3 = dht3.getTemperature();

dtostrf(temperature1, 1, 1, charT1);
dtostrf(humidity1, 1, 1, charH1);
dtostrf(temperature2, 1, 1, charT2);
dtostrf(humidity2, 1, 1, charH2);
dtostrf(temperature3, 1, 1, charT3);
dtostrf(humidity3, 1, 1, charH3);

if (sayac > 9999) sayac = 1;
}

void handle_OnConnect() {
wserver.send(200, “text/html”, SendHTML(temperature1, humidity1, temperature2, humidity2, temperature3, humidity3));
}

void handle_NotFound(){
wserver.send(404, “text/plain”, “Not found”);
}

String SendHTML(float Temperature1, float Humidity1, float Temperature2, float Humidity2, float Temperature3, float Humidity3){
//dtostrf(temperature1, 1, 1, charT1);
//dtostrf(humidity1, 1, 1, charH1);
//dtostrf(temperature2, 1, 1, charT2);
//dtostrf(humidity2, 1, 1, charH2);
//dtostrf(temperature3, 1, 1, charT3);
//dtostrf(humidity3, 1, 1, charH3);

String ptr = “<!DOCTYPE html> <html>\n”;
ptr +=”<head><meta name=\”viewport\” content=\”width=device-width, initial-scale=1.0, user-scalable=no\”>\n”;
ptr +=”<title>sky_tempserver</title>\n”;
ptr +=”<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n”;
ptr +=”body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n”;
ptr +=”p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n”;
ptr +=”</style>\n”;
ptr +=”<meta http-equiv=refresh content=10 ></head>\n”;
ptr +=”<body>\n”;
ptr +=”\n”;
ptr +=”Temperature/Humidity Monitor\n”;
ptr +=”ZONE-1:”;
ptr +=”Temp.: “;
ptr +=charT1;
ptr +=”C”;
ptr +=”Hum: “;
ptr +=charH1;ptr +=”%”;
ptr +=”ZONE-2:”;
ptr +=”Temp.: “;
ptr +=charT2;
ptr +=”C”;
ptr +=”Hum: “;
ptr +=charH2;
ptr +=”%”;
ptr +=”ZONE-3:”;
ptr +=”Temp.: “;
ptr +=charT3;
ptr +=”C”;
ptr +=”Hum: “;
//ptr +=”“;
ptr +=charH3;
ptr +=”
“;
ptr +=”%”;
ptr +=””;
ptr +=””;
ptr +=””;
ptr +=””;
ptr +=”webserver v.1.0 | tcp server v.1.0 (tcp:9876) | designed by SKY @2019“;
ptr +=””;
ptr +=(String) sayac++;
ptr +=””;
ptr +=”\n”;
ptr +=”</body>\n”;
ptr +=”</html>\n”;
return ptr;
}

*************************************************************************************

Yine ihtiyaçdan doğan bir proje. Rejilerde, saat (timekod) bilgisini referans sinyali üzerinden (VITC) alan saatler mevcut. Referans üreteci (sync generator), timekod bilgisini, GPS bazlı TC jeneratöründen LTC olarak alıyor ve referans sinyaline ekliyor.
Böylelikle, hem içinde saat bilgisi olan LTC sinyali, hem de içine saat bilgisi eklenmiş
referans (genlock) sinyali elde etmiş oluyoruz. Saat bilgisi tüm sisteme, referasn sinyali ile dağıtılmış oluyor.
Daha önceden stüdyodaki saatler analog ve LTC uyumluydu. Bunları dijitale çevirmek istediğimizde, saat başına 2000-2500$ civarında rakamlar çıkıyor.

(LTC:  linear time code)
(VITC:  vertical interval time code)
LTC konusunda daha önce yazmıştım, sayfanın sonunda linkini bulabilirsiniz.

Türkiye piyasasında, 7 segment display yapan birçok firma var. Bunlar  RS232 veya RS485 girişli olabiliyor. Fiyatları da yaklaşık 400-500 TL civarında.
Bu panelleri sürmek için tek gereken wifi ve seri portu olan bir mikrokontrolcü devre. Bu devrenin maliyeti de yaklaşık 60 TL tutuyor. Sonuç olarak 500 TL’ye wireless AP üzerinden ağa bağlanan, kendini periyodik olarak GPS üzerinden güncelleyen, VITC/LTC timekod ile senkron bir saatim oldu. Tabi timekod sinyali ile frame bazında senkron olması mümkün değil ancak maliyet ve kullanım yeri/amacı açısından bakıldığında son derece başarılı bir uygulama oldu.


PC’deki yazılımlara gelirsek;
Network Time yazılımı NTP server olarak çalışıyor. GPS’den güncellenen sistem saatini alıyor ve kendine bağlanan istemcilere dağıtıyor. (Saat üzerindeki devre, isterse, saat bilgisini internet üzerindeki herhangi bir NTP server’dan da alabilir.)

Diğer uygulama, kablosuz ağa bağlı saatleri gösteriyor. Şu an  kullanılan 5 adet saatim var (tek modül, önlü arkalı bağlanmış 2 saat panelini sürüyor).
Saatler periyodik olarak kendilerini güncelliyor ancak istenirse manuel olarak da yazılım üzerinden güncelleme yapılabiliyor.

Konuyla ilgili:
LTC TimeCode Reader

CW Beacon (Arduino)

Yayınlandı: Ocak 16, 2017 / Hardware & Software
Etiketler:, , ,

Arduino nano/mini/uno kullanılabilir. Ben D3 ve D10 pinlerini kullandım ama kod içinde istediğiniz pinleri atayabilirsiniz.
PTT için kullanılacak telsiz cihazının bağlantı şekli önemli. Ben Baofeng el cihazı ile kullanıyorum. Mosfet yerine optokuplör de kullanılabilir.


20170116_181218_resized

Devre, periyodik olarak (şu anda 15 saniyede bir) CW olarak çağrı işaretini (veya sizin tanımlayacağınız kelimeleri) gönderir.
Kodda da görüleceği gibi, hız vs. gibi değerleri ayarlamak mümkün.

//************************************************************************************************

#define SPEED (22) //speed in WPM
#define DOTLEN (1200/SPEED)
#define DASHLEN (3*(1200/SPEED))
#define PAUSE 15 //Time in seconds between transmissions

int txPin=10; //Digital pin used to show when the tone is playing. Pin 13 has an attached led on most Arduino boards.
int ledPin=13; //Digital pin used to show when the tone is playing. Pin 13 has an attached led on most Arduino boards.
int tonePin=3; //Digital pin used to send the tone. It MUST be a PWM pin (Marked with ~).
int toneFreq=900; //Tone frequency. Usually between 500 and 900 Hz.

void sendMsg(char*);
void dash();
void dot();

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(txPin, OUTPUT);
}

void loop()
{
digitalWrite(txPin, HIGH);
delay(20);
sendMsg(“TA1MRT DE 73″); //Remember to replace it with your callsign/message!
delay(20);
digitalWrite(txPin, LOW);
delay(PAUSE*1000);
}
void dash()
{
digitalWrite(ledPin, HIGH);
tone(tonePin, toneFreq);
delay(DASHLEN);
digitalWrite(ledPin, LOW);
noTone(tonePin);
tone(tonePin, 21000);
delay(DOTLEN);
noTone(tonePin);
}

void dot()
{
digitalWrite(ledPin, HIGH) ;
tone(tonePin, toneFreq);
delay(DOTLEN);
digitalWrite(ledPin, LOW);
noTone(tonePin);
tone(tonePin, 21000);
delay(DOTLEN);
noTone(tonePin);
}
void sendMsg(char *str)
{
int i;

tone(tonePin, 21000);
delay(500);
noTone(tonePin);

for(i=0;i<strlen(str);i++)
{
switch (str[i])
{
case ‘A’:
dot();dash();break;
case ‘B’:
dash();dot();dot();dot();break;
case ‘C’:
dash();dot();dash();dot();break;
case ‘D’:
dash();dot();dot();break;
case ‘E’:
dot();break;
case ‘F’:
dot();dot();dash();dot();break;
case ‘G’:
dash();dash();dot();break;
case ‘H’:
dot();dot();dot();dot();break;
case ‘I’:
dot();dot();break;
case ‘J’:
dot();dash();dash();dash();break;
case ‘K’:
dash();dot();dash();break;
case ‘L’:
dot();dash();dot();dot();break;
case ‘M’:
dash();dash();break;
case ‘N’:
dash();dot();break;
case ‘O’:
dash();dash();dash();break;
case ‘P’:
dot();dash();dash();dot();break;
case ‘Q’:
dash();dash();dot();dash();break;
case ‘R’:
dot();dash();dot();break;
case ‘S’:
dot();dot();dot();break;
case ‘T’:
dash();break;
case ‘U’:
dot();dot();dash();break;
case ‘V’:
dot();dot();dot();dash();break;
case ‘W’:
dot();dash();dash();break;
case ‘X’:
dash();dot();dot();dash();break;
case ‘Y’:
dash();dot();dash();dash();break;
case ‘Z’:
dash();dash();dot();dot();break;
case ‘ ‘:
tone(tonePin, 21000);
delay(DOTLEN*5);
noTone(tonePin);
break;
case ‘.’:
dot();dash();dot();dash();dot();dash();break;
case ‘,’:
dash();dash();dot();dot();dash();dash();break;
case ‘:’:
dash();dash();dash();dot();dot();break;
case ‘?’:
dot();dot();dash();dash();dot();dot();break;
case ‘\”:
dot();dash();dash();dash();dash();dot();break;
case ‘-‘:
dash();dot();dot();dot();dot();dash();break;
case ‘/’:
dash();dot();dot();dash();dot();break;
case ‘(‘:
case ‘)’:
dash();dot();dash();dash();dot();dash();break;
case ‘\”‘:
dot();dash();dot();dot();dash();dot();break;
case ‘@’:
dot();dash();dash();dot();dash();dot();break;
case ‘=’:
dash();dot();dot();dot();dash();break;
case ‘0’:
dash();dash();dash();dash();dash();break;
case ‘1’:
dot();dash();dash();dash();dash();break;
case ‘2’:
dot();dot();dash();dash();dash();break;
case ‘3’:
dot();dot();dot();dash();dash();break;
case ‘4’:
dot();dot();dot();dot();dash();break;
case ‘5’:
dot();dot();dot();dot();dot();break;
case ‘6’:
dash();dot();dot();dot();dot();break;
case ‘7’:
dash();dash();dot();dot();dot();break;
case ‘8’:
dash();dash();dash();dot();dot();break;
case ‘9’:
dash();dash();dash();dash();dot();break;

}
delay(2*DOTLEN);
}
}

ARDUINO Bootloader

Yayınlandı: Ağustos 26, 2016 / Hardware & Software
Etiketler:, , ,

Dün gece Arduino MEGA2560 ile çalışırken, Watchdog timer’ı aktif yapıp denemek istedim.
Kodu yükledikten sonra da, bir daha MEGA’ya program atabilmek mümkün olmadı.
Kart sürekli kendini resetlediğinden, IDE’den veya hex loader’dan erişmek mümkün olmadı.
Hala da bir programlayıcım olmadığından, daha önce 328P’ye yüklediğim gibi, başka bir arduino’dan
kod atıp atamayacağımı araştırdım.
Evde bir tane 328p çipli x-board modülü vardı, bu modül UNO ile hemen hemen aynı.

board

Nette biraz araştırma ve birkaç deneme sonucu Nick Gammon’un sitesinde güzel ve kullanışlı bir kod
buldum.

Bu linkten konuya ve koda ulaşabilirsiniz. (http://www.gammon.com.au/forum/?id=11633)

ilk adım kodları indirmek ve zipten çıkarttığınız klasörü olduğu gibi, arduino/libraries altına atmak.
IDE’yi açıp, “ATMEGA BOARD PROGRAMMER” dosyasını yüklüyoruz.

ide
Bağlantılara gelince;
UNO’nun (veya başka bir model) ICSP pinlerini (MOSI, MISO, SCK) mega’nın ICSP pinlerine, bire bir bağlıyoruz.
MEGA’yı USB’den ayrıca besliyoruz. UNO’nun 10.pinini, MEGA’nın RESET pinine bağlıyoruz.
UNO’ya (ya da ne kullanıyorsanız) kodu yüklüyoruz ve seri monitör penceresini açıyoruz. “G” tuşuna basıyoruz ve
bootloader hex, MEGA’ya yükleniyor. Hepsi bu 🙂

monitor

Biraz zaman kaybetsem de, yeni bir mega almaktan kurtuldum. Çalışmaya devam…

 

Frekans Sayıcı (HF)

Yayınlandı: Kasım 19, 2015 / Hardware & Software
Etiketler:, , , ,

frq
Anten Tuner projem için yaptığım frekans sayıcı devresi. İhtiyaca göre değişiklik yapılarak, genel amaçlı da kullanılabilir.

Devreyi hem PIC ile hem de Arduino ile yaptım. Kontrolcü dışında aralarında fark yok. Çıkışa LCD veya 7 Segment bağlanabilir. PIC ile deneme yaparken seri porta yazdırmayı tercih ettim. 74HC93 bölücü entegresi ile, 0-50MHz arasında rahatlıkla kullanılabilir. VHF/UHF ölçümü için MB506 bölücü entegresi kullanılabilir.

img060

(İsteğe göre, Arduino veya PIC kullanılabilir, buffer ve bölücü devresi ikisi için de aynıdır)

74HC93 kullanmazsanız, transistörlü buffer devresi ile yaklaşık 7MHz’e kadar ölçüm yapabilirsiniz. RF giriş seviyesi yüksek gelirse, direnç ile bölmek gerekiyor, ben 2k2 ve şaseye 10k ile sinyal uyguladım.
(bölücü kullanmadan da, 50MHz’e kadar ölçmek mümkün, ancak o zaman timing ayarlarını değiştirmek gerekiyor, benim kullanımıma uymadığından tercih etmedim)

20151119_213552

16F628A Frekans Sayıcı devresi

20151119_21361620151119_213639

 

 

 

 

 

Arduino’da 7 segment display kullandım. MAX7219 ile yapılmış hazır devreler var. (2$’ın altında) Zamanında sadece entegrenin 5-6$’a satıldığını düşünürsek gayet hesaplı.
UntitledPIC ile uğraşmak istemeyenler, Arduino mini pro kullanabilir. Frekansa göre ufak bir kalibrasyon yapmak gerekiyor ancak başlangıç için bu hassasiyet idare eder diye düşünüyorum.

Arduino test videosu:
youtube https://www.youtube.com/watch?v=Ccg8ScK1pc4

Deneme için gerekli dosyaları aşağıdaki linklerden indirebilirsiniz.
74HC93 kullanılacaksa, hesaplanan frekans değeri 8 ile çarpılmalı.
Devre şeması ve kodlar final hali değildir, üzerinde küçük değişiklikler yapmak gerekebilir.

Dosyalar:
PIC hex dosyası (TTL seri, 9600 baud)
Arduino ino file

Arduino SWR-Power Metre

Yayınlandı: Şubat 23, 2015 / Hardware & Software
Etiketler:, , ,

ON7EQ‘nin yapmış olduğu, benim de yapmaya başladığım SWR/Power Metre devresi.
Devre Arduino ile yapılmış. Gerekli dökümanlar için ON7EQ‘nin sayfasına buradan ulaşabilirsiniz. SWR köprüsü için birkaç alternatif var,
ben OH2NLT‘nin devresini yaptım. Şimdilik sadece HF bandında test edebildim, ancak uygun swr köprüsü ile
VHF ve UHF bandında da kullanılabilir.

SWR köprüsü devre şeması için tıklayınız. (FT50-43’ü ebay üzerinden alabilirsiniz.)

20150304_223541

 

Devre şeması (Z32AN): 

Schematic_by_Z32AN
SWR köprüsünden gelen 2 analog sinyali, 47k seri direnç üzerinden aldım, şemada görülen 470k dirençleri de 15k ile değiştirdim.
Diyot olarak 1N60 kullandım.

Kalibrasyon ve kullanım ile ilgili gerekli bilgiler, kod içinde var.

 

20150223_000906

20150223_000920

Devreyi alüminyum kutuya koymayı düşündüm, arka panelde UHF konnektörleri ve besleme girişi olacak.
Bridge ve kontrol kartı arasına ekranlama için bakır plaket koydum. Aksi takdirde, kaçan RF sinyali devrenin çalışmasını etkiliyor.

back

20150405_215001

20150405_214836

Wireless Servo

Yayınlandı: Nisan 10, 2014 / Hardware & Software
Etiketler:, , , , , , ,

Kamera netlik ve zoom ayarlarını uzaktan kontrol etmek için hazırlanmış kablosuz servo motor kontrol devresi.
Devre 2 modülden oluşuyor.

Verici: ATMEGA 328p kontrolcü ile kurulmuş kontrol devresi. RF Transceiver olarak NRF24L01 kullandım. Verici devre üzerinde toplam 3 adet potansiyometre ve 4 adet buton bulunuyor.
2 adet potansiyometre, alıcı taraftaki 2 servo motorun pozisyonu, 1 potansiyometre de,
hızını ayarlıyor. 4 adet buton, servonun (potansiyometrenin) o andaki konumunu kaydediyor ve gerektiğinde hafızadan çağırarak alıcı devreye gönderiyor.

Alıcı: verici devre ile aynı yapıya sahip. Kart üzerinde 2 adet servo motor çıkışı ve besleme girişleri var. Servo motorun besleme girişi ayrı, servo motor da 5V ile çalışıyorsa aynı besleme ikisi için de kullanılabilir.

Devreler harici bir ftdi modül ile programlanabiliyor. RF modüller çift yönlü olmasına rağmen ben tek taraflı haberleşme kullnamayı tercih ettim. Birden fazla modül (alıcı veya verici) kullanılacaksa, her biri için farklı kanallar seçilebilir. Nordic rf modüller istenirse daha güçlü modüller ile değiştirilerek menzil arttırılabilir.

24l01plusnRF24L01-LN-PA-1Devrede kullanılan servolar 180 derece dönebilen standart R/C servodur. Servo pozisyon süreleri marka/modele göre farklılık gösterse de, kod içinden gerekli tanımlamalar yapılarak kullanılabilir.

Alıcı Devresi:
servo_rxVerici devresi:
servo_tx

Wireless modül bağlantısını doğru yaptıktan sonra iş yazılıma kalıyor. Aşağıdaki linkten
NRF24L01 için ilgili kütüphaneyi (mirf.zip) indirip arduino/libraries altına açın.
Örnekler size yardımcı olacaktır.

NRF24L01 hakkında:
http://www.hobbyking.com/hobbyking/store/uploads/820169487X569826X26.pdf

NRF24L01 ve ARDUINO:
http://playground.arduino.cc/InterfacingWithHardware/Nrf24L01

DSC_0199-600x600

  • MCU:Atmega328P low voltage version (16Mhz)
  • Ethernet:WIZ5100
  • Arduino Uno bootloader
  • Supply voltage:5~12v
  • Output voltage:5v/3.3v
  • Digital IO: 8
  • Analog In: 8

Arduino uyumlu  x-board modülü ile, ethernet kontrollü uygulamalar yapmak mümkün. iphone’un da bu modül için (veya UNO+ethernet shield) bir uygulaması var. Adı: xhouse.

Bu uygulama hakkında detaylı bilgiye aşağıdaki linklerden ulaşabilirsiniz.

xhouse

http://www.dfrobot.com/community/xhouse-intelligent-life-amazing-internet-of-things-technology.html

https://itunes.apple.com/us/app/xhouse/id643548682?ls=1&mt=8

700px-Xboard_v2_pinout_1024x586Modülün tek eksiği, usb üzerinden programlanabilir olmaması. Bunun için bir usb-ttl çevirici almanız gerekiyor. Bunun dışında, bu modül ile ethernet üzerinden UDP veya TCP uygulamalar geliştirmek çok kolay.

udp portu üzerinden nasıl haberleşebileceğinize dair basit bir arduino kodu:
program, 8888 portundan delen paketleri alır ve geri gönderir.

 #include <SPI.h>
#include <Ethernet.h>

#include <EthernetUdp.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 16);
unsigned int localPort = 8888;      // local port to listen on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = “acknowledged”;       // a string to send back
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  Serial.begin(9600);
}
void loop() {
  // if there’s data available, read a packet
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    Serial.print(“Received packet of size “);
    Serial.println(packetSize);
    Serial.print(“From “);
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(“.”);
      }
    }
    Serial.print(“, port “);
    Serial.println(Udp.remotePort());
    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    Serial.println(“Contents:”);
    Serial.println(packetBuffer);
    sprintf(packetBuffer,”%s”, ” “);
    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(10);
}
wiki:

Lazer projeksiyon cihazı için çalışmalarım çok hızlı olmasa da devam ediyor.
Geldiğim noktada, hızla ve kalibrasyonla ilgili sorunlar yaşasam da sonuç fena değil.

Finalde 3 renk olarak düşündüğüm ama deneme için tek renk kullandığım, lazer projeksiyon sistemi aşağıda.

IMG_1591

Sistem, Galvo scanner/driver, DAC kartı, mikrokontrolcü kartı, laser ünitesi ve besleme devrelerinden oluşuyor.

IMG_1600Galvo scanner’i hazır aldım, elde yapmak da mümkün ve bu konuda örnekler de var ancak zahmetli ve zor iş. ebay’de arama yaparsanız bir çok galvo bulabilirsiniz. Laser ünitesi resimdeki gibi, 532nm 80mW  TTL green lazer bunun bir de sürücü devresi var. 12V ile besleniyor ve yaklaşık 100mA akım çekiyor.
DAC kartı kanal başına 5 bit, ancak benim kullandığım lazer TTL modilasyonlu olduğu için şu anda lazer seviyesini kontrol edemiyorum.  Piyasada analog modilasyonlu lazer modüller mevcut. (TTL ve analog bir arada olanlar da var)

IMG_1602

Galvo sürücüler ve laser modül, DAC kartı tarafından sürülüyor.
Kullandığım DAC kartının özellikleri şöyle;
5 bit analog RGB
12bit analog X,Y Galvo çıkışı
Shutter

DAC kartı,  ATMega328P mikrokontrolcü ile kontrol ediliyor. DAC kartını tek tarflı olarak
çizdim, Atmega’yı bu plaket üzerine koymadım, ayrı bir devre olarak bağlanıyor.
İstenirse herhangi bir Arduino modeli de bağlanabilir.

001

IMG_1598

Besleme devresi +/-12V, 5V DC (DAC ve kontrolcü için) Galvo scanner içinde +/-15V DC’den oluşuyor. Lazer modül 12V ile çalışıyor ancak sisteme gürültü bindirdiği için beslemesini ayrı tuttum.

laserout

Test paternlerinde düzeltilmesi gereken birkaç sorun var, galvo sürücülerin kalibrasyonunun yapılması gerekiyor. Sonrasında bir show programıyla yazı ve animasyon performansına bakmak gerekiyor.

-devam edecek-

Atmel programlayıcınız yoksa ve bootloader yüklü kontrolcü satın almadıysanız, aşağıdaki yöntemle ATMega168 ve AtMega328 kontrolcülerine bootloader kodunu atabilirsiniz. Tabi bunun için elinizde en azından bir Arduino kartı olması gerekiyor.

UNO kartını bilgisayara takıyoruz ve “Examples” klasöründeki ArduinoISP kodunu IDE’ye yüklüyoruz.


Arduino 1.0 sürümünü kullanıyorsanız bu kod içinde bir değişiklik yapmak gerekiyor.
Bunun için; kod içinde heartbeat fonksiyonunu aratın ve fonksiyon içindeki delay(40) değerini, delay(20) olarak değiştirin.

Bu kodu karta yükleyin ve alttaki devrelerden birini kurun.

Ben ATMega328P-PU için sağdaki devreyi kurdum ancak RESET ucundaki 10k direnci kullanmadım. Bağlantılar aşağıdaki şekilde;

UNO D10  ->  ATmega RESET (1)
UNO D11  ->  ATmega SCK (19)

UNO D12  ->  ATmega MISO (18)
UNO D13  ->  ATmega MOSI (17)
UNO 5V    ->  ATmega VCC (7,20)
UNO GND ->  ATmega GND (8,22)

Bunların dışında; isterseniz UNO’ya status ledlerini de bağlayabilirsiniz. 

D9: Heartbeat         – shows the programmer is running
D8: Error                – Lights up if something goes wrong (use red if that makes sense)
D7: Programming    – In communication with the slave

Seri port seçimini de yaptıktan sonra, Programlayıcı olarak “Arduino as ISP” seçiyorsunuz
ve <Burn Bootloader> ‘ı seçiyorsunuz.  Birkaç saniyede, bootloader kodu yükleniyor.



Uno’nun yeni sürümlerinde deneme şansım olmadı. Yüklemede sorun yaşarsanız, ArduinoISP kodunu attıktan sonra, 
Uno’nun reset ucunu 10uF kondansatör ile şaseye bağlayarak deneyebilirsiniz. 

Arduino sayfasında bu konuyla ilgili detaylı bilgi bulabilirsiniz. link

ATMEGA 328P