İçindekiler:

IOT123 - SOLAR TRACKER - KONTROL CİHAZI: 8 Adım
IOT123 - SOLAR TRACKER - KONTROL CİHAZI: 8 Adım

Video: IOT123 - SOLAR TRACKER - KONTROL CİHAZI: 8 Adım

Video: IOT123 - SOLAR TRACKER - KONTROL CİHAZI: 8 Adım
Video: Ух ты !! невероятное изобретение / Как сделать солнечный трекер из простых компонентов электроники 2024, Temmuz
Anonim
Image
Image
IOT123 - GÜNEŞ İZLEYİCİ - DENETLEYİCİ
IOT123 - GÜNEŞ İZLEYİCİ - DENETLEYİCİ
IOT123 - GÜNEŞ İZLEYİCİ - DENETLEYİCİ
IOT123 - GÜNEŞ İZLEYİCİ - DENETLEYİCİ

Bu, Eğitilebilirliğin bir uzantısıdır

IOT123 - SOLAR TRACKER - TILT/PAN, PANEL ÇERÇEVE, LDR MOUNT RIG. Burada servoların kontrolörüne ve güneşin konumunun sensörlerine odaklanıyoruz. Bu tasarımın 2 MCU'nun kullanılacağını varsaydığını belirtmek önemlidir: güneş izleyici için bir (3.3V 8mHz Arduino Pro Mini) ve sensörleriniz/aktörleriniz için bir bağımsız MCU.

Bu Sürüm 0.3'tür

Tüm projeleri tam bir memnuniyetten sonra yayınlamak yerine, sürekli entegrasyon uygulayacağım ve teslim ettiklerimi ihtiyacım olduğu gibi değiştirerek daha sık bir şeyler sunacağım. Pil şarj cihazı için başka bir talimat yazacağım, _ne zaman_ denetleyici yazılımının/donanımının optimizasyonu tamamlandığında. Bunu adım adım ilerlerken, optimizasyonların nerede gerekli olduğuna işaret edeceğim.

Bu yaklaşımın bir nedeni müşteri geri bildirimidir. Bir ihtiyaç görürseniz veya daha iyi bir yaklaşımınız varsa, lütfen yorum yapın, ancak her şeyi ve muhtemelen size uygun bir zaman çerçevesine teslim edemeyeceğimi unutmayın. Bu açıklamalar daha az alakalı göründüğü için bu makaleden silinecektir.

Bu ne içerir:

  1. Güneşlerin yaklaşık konumunu algılamak için orijinal Eğitilebilir Dosyadaki LDR'leri kullanın.
  2. Servoları güneşe bakacak şekilde hareket ettirin.
  3. Hareketlerin hassasiyeti için seçenekler.
  4. Güneşe çıkarken adım boyutu seçenekleri.
  5. Servolarda kullanılan açısal kısıtlamalar için seçenekler.
  6. Hareketlerin gecikmesi için seçenekler.
  7. MCU'lar arasında değerleri ayarlamak/almak için I2C arayüzü.
  8. Hareketler arasında derin uyku.

Buna neler dahil değildir (ve zaman elverdikçe ele alınacaktır):

  1. Sadece gündüz saatlerinde güç kullanarak.
  2. Şafak pozisyonunu hatırlamak ve alacakaranlıkta oraya gitmek.
  3. Regülatörü MCU'dan çıkarma.
  4. MCU'daki LED'leri devre dışı bırakma.
  5. Gücü, RAW yerine VCC aracılığıyla yeniden yönlendirme.
  6. USB'den Seri TTL dönüştürücüye düzenlenmiş güç olmadan yanıp sönme için geçici çözümler sağlar.
  7. Akü voltajı monitörü.

TARİH

20 Ara 2017 V0.1 KODU

İlk sürüm, ışık kaynağını takip eder, her zaman açıktır, şarj olmaz

7 Ocak 2018 V0.2 KODU

  • DONANIM DEĞİŞİKLİKLERİ

    • I2C pinleri ekleyin
    • Servo GND'lere anahtar ekleyin
    • Denetleyici kutusu ön panosunda Basılı Etiket
  • YAZILIM DEĞİŞİKLİKLERİ

    • EEPROM'dan yapılandırmayı okuyun
    • Başka bir MCU'ya bağımlı olarak I2C veri yolu desteği (3.3V)
    • I2C aracılığıyla yapılandırmayı ayarlayın
    • I2C ile Etkinleştir
    • I2C aracılığıyla yapılandırmayı alın
    • I2C (şu anda Etkin ve Geçerli Işık Yoğunluğu) aracılığıyla çalışma zamanı özelliklerini alın
    • Seri kaydı kaldırın (I2C değerlerini etkiledi)

19 Oca 2018 V0.3 KODU

  • DONANIM

    Etiket güncellendi. Anahtar artık YAPILANDIRMA veya İZLEME modunu seçmek için kullanılıyor

  • YAZILIM

    • I2C yalnızca yapılandırma için kullanılır
    • Denetleyici, izlemeyi başlatmadan önce 5 saniye bekler, ellerin hareket etmesine izin verir
    • I2C yapılandırmasını kullanmak için SPDT, birim önyüklemesi olarak CONFIG'de olmalıdır
    • İzleme hareketi arasında, ünite UYKU DAKİKALARI (varsayılan 20 dakika) yapılandırma değeri için derin uyku modundadır.

Adım 1: Malzemeler ve Araçlar

Malzemeler ve Araçlar
Malzemeler ve Araçlar
Malzemeler ve Araçlar
Malzemeler ve Araçlar
Malzemeler ve Araçlar
Malzemeler ve Araçlar

Artık tam bir Malzeme Listesi ve Kaynaklar listesi var.

  1. 3D baskılı parçalar.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 adet 4x6cm Çift Taraflı Prototip PCB Üniversal Baskılı Devre Kartı (yarım kesilecek)
  4. 1 adet 40P erkek başlık (boyutuna göre kesilecek).
  5. 1 adet 40P dişi başlık (boyutuna göre kesilecek).
  6. 4 kapalı 10K 1/4W restistör.
  7. Bağlantı teli.
  8. Lehim ve Demir.
  9. 20 adet 4G x 6mm paslanmaz tava başlı kendinden kılavuzlu vida.
  10. 4 kapalı 4G x 6mm paslanmaz havşa başlı kendinden kılavuzlu vidalar.
  11. 1 kapalı 3.7V LiPo pil ve tutucu (2P dupont konektörlerde sonlandırma).
  12. 1 kapalı 2P erkek dik açılı başlık
  13. 1 kapalı SPDT anahtarı 3 pimli 2,54 mm aralık
  14. Güçlü Siyanoakrilat yapıştırıcı
  15. Dupont konnektörleri dişi 1P başlık (1 kapalı mavi, 1 kapalı yeşil).

Adım 2: Devrenin Montajı

Devrenin Montajı
Devrenin Montajı
Devrenin Montajı
Devrenin Montajı
Devrenin Montajı
Devrenin Montajı

Devrede şu anda Voltaj Bölücü Devresi (voltmetre) yoktur.

  1. 4x6cm Çift Taraflı Prototip PCB Evrensel Baskılı Devre Kartını uzun eksen boyunca yarıya kesin.
  2. 40P erkek başlığı parçalara ayırın:

    1. 2 kapalı 12P
    2. 3 kapalı 3P
    3. 6 kapalı 2P.
  3. 40P dişi başlığı parçalara ayırın:

    1. 2 kapalı 12P
    2. 1 kapalı 6P
  4. Lehim 2 kapalı 12Pdişi başlık gösterildiği gibi.
  5. 3P erkek (ek) başlıktan çıkarılan ara parçayı SPDT Switch'in alt tarafına Siyanoakrilat yapıştırıcı ile yapıştırın
  6. Diğer tarafta, gösterildiği gibi 6 kapalı 2P, 2 kapalı 3Pmale başlığını ve SPDT anahtarını lehimleyin.
  7. GND pin başlığına (#2 siyah) ve A0 - A3 başlık pinlerine (#5, #6, #7, #8) kurşun yoluyla 10K dirençleri (A, B, C, D siyah) lehim 4, ardından delikten (sarı) gösterildiği gibi (3 fotoğraf + 1 diyagram).
  8. LDR PINS lehimleme PINS #4, #6, #8, #10'dan 3.3V izleyin ve delikten dişi başlık VCC pimine (yeşil) geçirin.
  9. PINS #1, #12, #15'e lehimlemede gösterildiği gibi (kırmızı) dişi başlık tarafında 3.3V izleyin.
  10. 3.3V delikten lehimlenmiş yan (kırmızı) RAW başlık PIN #1.
  11. Gösterildiği gibi diğer taraftaki PIN #11'den delikten Lehim Dişi pime turuncu kancayı takip edin.
  12. #20'den #30'a ve #31'den #13 ve #16'ya kadar mavi bağlantı telini takip edin ve lehimleyin.
  13. Dişi Başlık PIN #11'i delikten Erkek Başlık PIN #11'e lehimleyin.
  14. Dişi 1P başlıklı 30 mm uzunluğunda 2 dupont konektör hazırlayın (1 kapalı mavi, 1 kapalı yeşil). Diğer ucunu soyun ve kalaylayın.
  15. Mavi Dupont telini #28'e lehimleyin; yeşil Dupont telini #29'a lehimleyin.
  16. Arduino'nun üst tarafında 6P dişi başlığı sabitleyin ve ardından lehimleyin.
  17. Arduino'nun üst tarafında 2P dik açılı dişi başlığı int #29 ve #30 sabitleyin ve ardından lehimleyin.
  18. Arduino'nun alt tarafında 2 / 12P ve 1 kapalı 3P erkek pini sabitleyin ve ardından lehimleyin.
  19. Arduino erkek 12P pinlerini PCB 12P dişi başlıklara yerleştirin.

3. Adım: MCU'yu Yanıp Sönme

MCU'nun yanıp sönmesi
MCU'nun yanıp sönmesi
MCU'nun yanıp sönmesi
MCU'nun yanıp sönmesi
MCU'nun yanıp sönmesi
MCU'nun yanıp sönmesi

Arduino Pro Mini, 6P dişi başlık kullanılarak bir FTDI232 USB'den TTL'ye dönüştürücü kullanılarak uygun şekilde flash'lanır. 2 kartın hizalanması için yukarıdaki fotoğrafa bakın.

FTDI232'nizde 3.3V ayarının seçildiğinden emin olun. Aşağıdaki kodu kullanarak buradaki talimatları izleyin (GIST bağlantısını kullanın).

Lowpower kitaplığının (ekli ve https://github.com/rocketscream/Low-Power) yüklenmesi gerekiyor.

Arduino Pro Mini + PCB kasaya takıldıktan sonra, başlık pinleri açıkta olduğu için hala yanıp sönebilir. Kontrol Ünitesini, başlığı açığa çıkaran Panel Çerçevesinden ayırmanız yeterlidir.

I2C/EEPROM konfigürasyonuna ve hareketler arasında uyku döngüsüne sahip tilt pan solar tracker. Süre arttıkça uyku döngüsü süresi kesinliği azalır, ancak bu amaç için yeterlidir

/*
* koddan değiştirildi
* Mathias Leroy tarafından
*
* V0.2 DEĞİŞİKLİKLERİ
** I2C SET AL
** EEPROM SET ALIN
** SERİ ÇIKIŞI KALDIR - ETKİLENEN I2C
** İZLEMEYİ ETKİNLEŞTİR/DEVRE DIŞI BIRAK
** SERVOS'U I2C İLE SINIRLARA TAŞIYIN
** MEVCUT ORTA YOĞUNLUĞU I2C ÜZERİNDEN OKUYUN
* V0.3 DEĞİŞİKLİKLERİ
** 2 MOD İÇİN GEÇİŞ - PARÇA (I2C YOK) ve YAPILANDIRMA (I2C KULLANIR)
** PARÇA MODUNDA UYKU (8 İKİNCİ PARÇALAR NEDENİYLE ÇOK DÜŞÜK HASSASİYET)
** UYKUDA/UYANIKTA SERVİSLERİ AYIRMA/TAKMA (SONUNDA KULLANILAN TRANSİSTÖR)
** YAPILANDIRILABİLİR BAŞLANGIÇ KONUMUNU KALDIR (YEDEK)
** YAPILANDIRILABİLİR UYANMA SANİYELERİNİ KALDIR (YEDEK)
** KALDIR YAPILANDIRILABİLİR ETKİN/DEVRE DIŞI (YEDEK)
** YAPILANDIRILABİLİR İZLEYİCİ KALDIR ETKİNLEŞTİRİLDİ (DONANIM ANAHTARI KULLANIN)
** GERİLİM ALICIYI ÇIKARIN - AYRI I2C BİLEŞENİ KULLANACAKTIR
** I2C KULLANMADIĞINDA SERİ GÜNLÜK EKLEME
*/
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
#defineEEPROM_VERSION1
#defineI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
#definePIN_SERVO_V11
#definePIN_SERVO_H5
#defineIDX_I2C_ADDR0
#defineIDX_V_ANGLE_MIN1
#defineIDX_V_ANGLE_MAX2
#defineIDX_V_SENSITIVITY3
#defineIDX_V_STEP4
#defineIDX_H_ANGLE_MIN5
#defineIDX_H_ANGLE_MAX6
#defineIDX_H_SENSITIVITY7
#defineIDX_H_STEP8
#defineIDX_SLEEP_MINUTES9
#defineIDX_V_DAWN_ANGLE10
#defineIDX_H_DAWN_ANGLE11
#defineIDX_DAWN_INTENSITY12// tüm LDRS'lerin ortalaması
#defineIDX_DUSK_INTENSITY13// tüm LDRS'lerin ortalaması
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15// tüm LDRS'lerin ortalaması - IDX_DAWN_INTENSITY ambiyant doğrudan olmayan ışığı hesaplamak için kullanılır
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_SIGN_319
Servo _servoH;
Servo _servoV;
bayt _i2cVals[20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0};
int _servoLoopDelay = 10;
int _slowingDelay=0;
int _açıH = 90;
int _açıV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
bayt _i2cResponse = 0;
bool _inConfigMode = yanlış;
geçersiz kurulum()
{
Seri.başla(115200);
getFromEeprom();
if (inConfigMode()){
Serial.println("Yapılandırma Modu");
Serial.print("I2C Adresi:");
Serial.println(_i2cVals[IDX_I2C_ADDR]);
Wire.begin(_i2cVals[IDX_I2C_ADDR]);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
}Başka{
Serial.println("İzleme Modu");
gecikme (5000);// pili vb. bağlarken elleri yoldan çekme zamanı.
}
}
boşluk döngüsü()
{
getLightValues();
if (!_inConfigMode){
// Yapılacaklar: TRANSİSTÖR ANAHTARINI AÇIN
_servoH.attach(PIN_SERVO_H);
_servoV.attach(PIN_SERVO_V);
for (int i = 0; i < 20; i++){
if (i != 0){
getLightValues();
}
hareketServos();
}
gecikme(500);
_servoH.detach();
_servoV.detach();
// Yapılacaklar: TRANSİSTÖR ANAHTARINI KAPATIN
gecikme(500);
sleepFor((_i2cVals[IDX_SLEEP_MINUTES] * 60) / 8);
}
}
//---------------------------------GEÇERLİ MOD
boolinConfigMode(){
pinMode(PIN_SERVO_H, GİRİŞ);
_inConfigMode = digitalRead(PIN_SERVO_H) == 1;
_inConfigMode döndür;
}
//---------------------------------EEPROM
voidgetFromEeprom(){
Eğer(
EEPROM.read(IDX_SIGN_1) != 'S' ||
EEPROM.read(IDX_SIGN_2) != 'T' ||
EEPROM.read(IDX_SIGN_3) != EEPROM_VERSION
) EEPROM_write_default_configuration();
EEPROM_read_configuration();
}
voidEEPROM_write_default_configuration(){
Serial.println("EEPROM_write_default_configuration");
for (int i = 0; i < IDX_END_EEPROM_SET; i++){
EEPROM.update(i, _i2cVals);
}
EEPROM.update(IDX_SIGN_1, 'S');
EEPROM.update(IDX_SIGN_2, 'T');
EEPROM.update(IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration(){
Serial.println("EEPROM_read_configuration");
for (int i = 0; i < IDX_END_EEPROM_SET; i++){
_i2cVals = EEPROM.read(i);
//Serial.println(String(i) + " = " + _i2cVals);
}
}
//---------------------------------I2C
voidreceiveEvent(int sayısı) {
if (sayım == I2C_MSG_IN_SIZE)
{
karakter cmd = Wire.read();
bayt indeksi = Wire.read();
bayt değeri = Wire.read();
geçiş (cmd) {
durum'G':
if (dizin< IDX_END_VALUES_GET){
_i2cResponse = _i2cVals[indeks];
}
kırmak;
vaka'S':
if (dizin< IDX_END_EEPROM_SET){
_i2cVals[indeks] = değer;
EEPROM.update(index, _i2cVals[index]);
}
kırmak;
varsayılan:
dönüş;
}
}
}
voidrequestEvent()
{
Wire.write(_i2cResponse);
}
//---------------------------------LDR'ler
voidgetLightValues(){
int değerTopLeft = analogRead(PIN_LDR_TL);
int değerTopRight = analogRead(PIN_LDR_TR);
int değerBottomRight = analogRead(PIN_LDR_BR);
int değerBottomLeft = analogRead(PIN_LDR_BL);
_averageTop = (değerTopLeft + değerTopSağ) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (valueBottomRight + valueBottomLeft) / 2;
_averageLeft = (değerBottomLeft + değerTopLeft) / 2;
int avgIntensity = (değerTopLeft + değerTopRight + değerBottomRight + değerBottomLeft) / 4;
_i2cVals[IDX_CURRENT_INTENSITY] = harita(ortYoğunluk, 0, 1024, 0, 255);
}
//---------------------------------SERVOS
voidmoveServos(){
Serial.println("moveServos");
if ((_averageLeft-_averageRight)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH-_i2cVals[IDX_H_STEP])>_i2cVals[IDX_H_ANGLE_MIN]) {
// sola gidiyor
Serial.println("moveServos sola gidiyor");
gecikme(_yavaşlamaGecikme);
for (int i=0; i < _i2cVals[IDX_H_STEP]; i++){
_servoH.write(_angleH--);
gecikme(_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH+_i2cVals[IDX_H_STEP])<_i2cVals[IDX_H_ANGLE_MAX]) {
// sağa gidiyor
Serial.println("moveServos sola gidiyor");
gecikme(_yavaşlamaGecikme);
for (int i=0; i < _i2cVals[IDX_H_STEP]; i++){
_servoH.write(_angleH++);
gecikme(_servoLoopDelay);
}
}
Başka {
// hiçbir şey yapmıyor
Serial.println("moveServos hiçbir şey yapmıyor");
gecikme(_yavaşlamaGecikme);
}
if ((_averageTop-_averageBottom)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV+_i2cVals[IDX_V_STEP])<_i2cVals[IDX_V_ANGLE_MAX]) {
// yukarı çıkıyor
Serial.println("moveServos yukarı gidiyor");
gecikme(_yavaşlamaGecikme);
for (int i=0; i < _i2cVals[IDX_V_STEP]; i++){
_servoV.write(_angleV++);
gecikme(_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV-_i2cVals[IDX_V_STEP])>_i2cVals[IDX_V_ANGLE_MIN]) {
// inme
Serial.println("moveServos aşağı gidiyor");
gecikme(_yavaşlamaGecikme);
for (int i=0; i < _i2cVals[IDX_V_STEP]; i++){
_servoV.write(_angleV--);
gecikme(_servoLoopDelay);
}
}
Başka {
Serial.println("moveServos hiçbir şey yapmıyor");
gecikme(_yavaşlamaGecikme);
}
}
//---------------------------------UYKU
voidasleepFor(unsignedint sekizSecondSegments){
Serial.println("uykuda");
for (unsignedint sleepCounter = sekizSecondSegments; sleepCounter >0; sleepCounter--)
{
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

GitHub tarafından ❤ ile barındırılan rawtilt_pan_tracker_0.3.ino'yu görüntüle

Adım 4: Devre Muhafazasının Montajı

Devre Muhafazasının Montajı
Devre Muhafazasının Montajı
Devre Muhafazasının Montajı
Devre Muhafazasının Montajı
Devre Muhafazasının Montajı
Devre Muhafazasının Montajı
  1. Ardiuno Pro Mini'nin PCB üzerindeki başlıklara takıldığından emin olun.
  2. SOLAR TRACKER kontrol kutusu tabanını SOLAR TRACKER kontrol kutusu duvarlarına yerleştirin ve 2 adet 4G x 6mm paslanmaz havşa başlı kendinden kılavuzlu vidayla sabitleyin.
  3. SOLAR TRACKER kontrol kutusu tabanındaki boşluğa 6P Başlık yuvalı Ardiuno Pro Mini + PCB'yi yerleştirin.
  4. SOLAR TRACKER kontrol kutusu kapağını SOLAR TRACKER kontrol kutusu duvarlarına yerleştirin ve 2 adet 4G x 6mm paslanmaz havşa başlı vidayla sabitleyin.
  5. Montajı 4 adet 4G x 6mm paslanmaz havşa başlı vidayla Panel Çerçevesinin tabanına yukarıdan tutturun.

Adım 5: Donanım Kablolarını Kontrolöre Bağlama

Teçhizat Kablolarını Kontrolöre Bağlama
Teçhizat Kablolarını Kontrolöre Bağlama
Teçhizat Kablolarını Kontrolöre Bağlama
Teçhizat Kablolarını Kontrolöre Bağlama
Teçhizat Kablolarını Kontrolöre Bağlama
Teçhizat Kablolarını Kontrolöre Bağlama

Önceki Eğitilebilir Tablodan hazır olan ilgili bağlantılar, servolardan 4 kapalı 2P LDR bağlantıları ve 2 kapalı 3P bağlantılarıdır. Şarj hazır olana kadar geçici olan pildir. Şimdilik 2P DuPont bağlantısında sona eren bir 3.7V LiPo kullanın.

  1. LDR bağlantılarını (kutupsuz) yukarıdan takın:

    1. Sağ üst
    2. Sol üst
    3. Sağ alt
    4. Sol alt
  2. Servo bağlantılarını (sinyal kablosu solda olacak şekilde) yukarıdan takın:

    1. Yatay
    2. Dikey
  3. TEST İÇİN HAZIR OLANA KADAR BEKLEYİN SONRA: 3,7V DC Güç kablosunu +ve üste, -ve alta takın.

Adım 6: Denetleyiciyi Test Etme

Image
Image

Daha önce belirtildiği gibi, yazılım Solar Şarj iş akışı için optimize edilmemiştir. Yine de doğal (güneş) ve doğal olmayan ışık kaynakları kullanılarak test edilebilir ve ince ayar yapılabilir.

İzlemeyi kontrollü bir ortamda test etmek için UYKU DAKİKALARI'nı daha düşük bir değere ayarlamak uygun olabilir (bir sonraki adıma bakın).

Adım 7: Konsol Girişini Kullanarak I2C Üzerinden Yapılandırma

Bu, kontrolörün ikinci bir MCU aracılığıyla yapılandırılmasını, ayarların bir konsol penceresine girilmesini açıklar.

  1. Aşağıdaki komut dosyasını bir D1M WIFI BLOK (veya Wemos D1 Mini) üzerine yükleyin.
  2. USB'yi PC'den ayırın
  3. PIN BAĞLANTILARI:-ve (Kontrolör) => GND (D1M)+ve (Kontrolör) => 3V3 (D1M)SCL (Kontrolör) => D1 (D1M)

    SDA (Kontrolör) => D2 (D1M)

  4. SPDT anahtarını CONFIG konumuna çevirin
  5. USB'yi PC'ye bağlayın
  6. Arduino IDE'den doğru COM Portu ile bir konsol penceresi başlatın
  7. "Newline" ve "9600 baud" öğelerinin seçili olduğundan emin olun
  8. Komutlar Gönder Metin Kutusuna girilir ve ardından Enter tuşuna basılır
  9. Komutlar Karakter bayt bayt biçimindedir.
  10. İkinci bayt (üçüncü bölüm) dahil değilse, komut dosyası tarafından 0 (sıfır) gönderilir
  11. Seri girişi kullanırken dikkatli olun; "Enter" tuşuna basmadan önce girdiğiniz şeyi gözden geçirin. Kilitlenirseniz (örneğin, I2C adresini unuttuğunuz bir değere değiştirirseniz), kontrolör ürün yazılımını tekrar flaş etmeniz gerekecektir.

Komutun ilk karakterinde desteklenen varyasyonlar şunlardır:

  • E (Servo izlemeyi etkinleştir) konfigürasyon sırasında hareketi durdurmak için kullanışlıdır. Bu kullanılarak girilir: E 0
  • D (Servo izlemeyi devre dışı bırak) cihazı yeniden başlatmıyorsa otomatik izlemeyi başlatmak için kullanışlıdır. Bu kullanılarak girilir: D 0
  • G (Yapılandırma değerini al) EEPROM ve IN-MEMORY'den değerleri okur: Bu, şunu kullanarak girilir: G (indeks, 0 - 13 ve 15 arasındaki geçerli bayt değerleridir)
  • S (EEPROM değerini ayarla), yeniden başlatmalardan sonra kullanılabilen değerleri EEPROM'a ayarlar. Bu şunu kullanarak girilir: S (dizin 0 - 13 geçerli bayt değerleridir, değer geçerli bayt değerleridir ve özelliğe göre değişir)

Kod, dizinler için gerçeğin noktasıdır, ancak geçerli değerler/yorumlar için bir kılavuz olarak aşağıdakiler kullanılır:

  • I2C ADDRESS 0 - denetleyici bağımlı adresi, ana aygıtın denetleyiciyle iletişim kurmak için buna ihtiyacı vardır (varsayılan 10)
  • MİNİMUM DİKEY AÇI 1 - açı dikey servo alt sınırı (varsayılan 10, aralık 0 - 180)
  • MAKSİMUM DİKEY AÇI 2 - açı dikey servo üst sınırı (varsayılan 170, aralık 0 - 180)
  • HASSASİYET DİKEY LDR 3 - Dikey LDR okuma marjı (varsayılan 20, aralık 0 - 1024)
  • DİKEY AÇI ADIM 4 - her ayarda açılı dikey servo adımları (varsayılan 5, aralık 1 - 20)
  • MİNİMUM YATAY AÇI 5 - açı yatay servo alt sınırı (varsayılan 10, aralık 0 - 180)
  • MAKSİMUM YATAY AÇI 6 - açı yatay servo üst sınırı (varsayılan 170, aralık 0 - 180)
  • HASSASİYET YATAY LDR 7 - Yatay LDR okuma marjı (varsayılan 20, aralık 0 - 1024)
  • YATAY AÇI ADIM 8 - her ayarda açılı yatay servo adımları (varsayılan 5, aralık 1 - 20)
  • UYKU DAKİKALARI 9 - izleme arasındaki yaklaşık uyku süresi (varsayılan 20, aralık 1 - 255)
  • DİKEY ŞAFAK AÇISI 10 - GELECEKTE KULLANIM - güneş battığında geri dönülecek dikey açı
  • YATAY ŞAFAK AÇISI 11 - GELECEKTE KULLANIM - güneş battığında geri dönülecek yatay açı
  • DAWN INTENSITY 12 - GELECEK KULLANIM - günlük güneş takibinin başlamasını tetikleyen tüm LDR'lerin minimum ortalaması
  • DUSK INTENSITY 13 - GELECEK KULLANIM - günlük güneş takibinin sonunu tetikleyen tüm LDR'lerin minimum ortalaması
  • EEPROM DEĞERLERİNİN SONU İŞARETÇİ 14 - DEĞER KULLANILMAMIŞTIR
  • MEVCUT YOĞUNLUK 15 - ışık yoğunluğunun mevcut ortalama yüzdesi
  • HAFIZA İÇİ DEĞER SONU İŞARETÇİ 16 - DEĞER KULLANILMAMIŞTIR.

Seri girişi (konsol penceresindeki klavye girişi) yakalar ve onu karakter, bayt, bayt biçiminde bir I2C bağımlı birimine iletir

#Dahil etmek
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = yanlış;
const bayt _numChars = 32;
char _alınanKarakterler[_numKarakterler]; // alınan verileri depolamak için bir dizi
voidsetup() {
Seri.başla(9600);
Tel.başla(D2, D1);
gecikme (5000);
}
boşluk döngüsü() {
recvWithEndMarker();
parseSendCommands();
}
voidrecvWithEndMarker() {
statik bayt ndx = 0;
karakter endMarker = '\n';
karakter rc;
while (Serial.available() >0 && _newData == false) {
rc = Seri.read();
if (rc != endMarker) {
_receivedChars[ndx] = rc;
ndx++;
if (ndx >= _numChars) {
ndx = _numChars - 1;
}
} Başka {
_receivedChars[ndx] = '\0'; // stringi sonlandır
ndx = 0;
_newData = doğru;
}
}
}
voidparseSendCommands() {
if (_newData == doğru) {
constchar sınır[2] = "";
karakter * belirteci;
belirteç = strtok(_receivedChars, sınırlayıcı);
char cmd = _alınanKarakterler[0];
bayt indeksi = 0;
bayt değeri = 0;
int ben = 0;
while(belirteç != NULL) {
//Serial.println(belirteç);
ben++;
geçiş (i){
dava 1:
belirteç = strtok(NULL, sınırlandırma);
indeks = atoi(belirteç);
kırmak;
durum2:
belirteç = strtok(NULL, sınırlandırma);
if (belirteç != NULL){
değer = atoi(belirteç);
}
kırmak;
varsayılan:
simge = NULL;
}
}
sendCmd(cmd, indeks, değer);
_newData = yanlış;
}
}
vidsendCmd(char cmd, bayt dizini, bayt değeri) {
Serial.println("-----");
Serial.println("Komut Gönderiliyor:");
Serial.println("\t" + String(cmd) + "" + String(index) + "" + String(değer));
Serial.println("-----");
Wire.beginTransmission(I2C_SLAVE_ADDRESS); // cihaza ilet
Wire.write(cmd); // bir karakter gönderir
Wire.write(indeks); // bir bayt gönderir
Wire.write(değer); // bir bayt gönderir
Wire.endTransmission();
bayt yanıtı = 0;
bool hadResponse = yanlış;
if (cmd == 'G'){
Wire.requestFrom(I2C_SLAVE_ADDRESS, 1);
while(Wire.available()) // slave istenenden daha azını gönderebilir
{
hadResponse = doğru;
yanıt = Wire.read();
}
if (hadResponse == doğru){
Serial.println("Yanıt alınıyor:");
Serial.println(yanıt);
}Başka{
Serial.println("Yanıt yok, adresi/bağlantıyı kontrol edin");
}
}
}

GitHub tarafından ❤ ile barındırılan rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino'yu görüntüle

8. Adım: Sonraki Adımlar

Yazılım/donanımdaki değişiklikleri kontrol etmek için periyodik olarak tekrar kontrol edin.

Yazılımı/donanımı gereksinimlerinize göre değiştirin.

Herhangi bir istek/optimizasyon hakkında yorum yapın.

Önerilen: