İçindekiler:
- Adım 1: Malzemeler ve Araçlar
- Adım 2: Devrenin Montajı
- 3. Adım: MCU'yu Yanıp Sönme
- Adım 4: Devre Muhafazasının Montajı
- Adım 5: Donanım Kablolarını Kontrolöre Bağlama
- Adım 6: Denetleyiciyi Test Etme
- Adım 7: Konsol Girişini Kullanarak I2C Üzerinden Yapılandırma
- 8. Adım: Sonraki Adımlar
Video: IOT123 - SOLAR TRACKER - KONTROL CİHAZI: 8 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:20
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:
- Güneşlerin yaklaşık konumunu algılamak için orijinal Eğitilebilir Dosyadaki LDR'leri kullanın.
- Servoları güneşe bakacak şekilde hareket ettirin.
- Hareketlerin hassasiyeti için seçenekler.
- Güneşe çıkarken adım boyutu seçenekleri.
- Servolarda kullanılan açısal kısıtlamalar için seçenekler.
- Hareketlerin gecikmesi için seçenekler.
- MCU'lar arasında değerleri ayarlamak/almak için I2C arayüzü.
- Hareketler arasında derin uyku.
Buna neler dahil değildir (ve zaman elverdikçe ele alınacaktır):
- Sadece gündüz saatlerinde güç kullanarak.
- Şafak pozisyonunu hatırlamak ve alacakaranlıkta oraya gitmek.
- Regülatörü MCU'dan çıkarma.
- MCU'daki LED'leri devre dışı bırakma.
- Gücü, RAW yerine VCC aracılığıyla yeniden yönlendirme.
- 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.
- 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
Artık tam bir Malzeme Listesi ve Kaynaklar listesi var.
- 3D baskılı parçalar.
- Arduino Pro Mini 3.3V 8mHz
- 1 adet 4x6cm Çift Taraflı Prototip PCB Üniversal Baskılı Devre Kartı (yarım kesilecek)
- 1 adet 40P erkek başlık (boyutuna göre kesilecek).
- 1 adet 40P dişi başlık (boyutuna göre kesilecek).
- 4 kapalı 10K 1/4W restistör.
- Bağlantı teli.
- Lehim ve Demir.
- 20 adet 4G x 6mm paslanmaz tava başlı kendinden kılavuzlu vida.
- 4 kapalı 4G x 6mm paslanmaz havşa başlı kendinden kılavuzlu vidalar.
- 1 kapalı 3.7V LiPo pil ve tutucu (2P dupont konektörlerde sonlandırma).
- 1 kapalı 2P erkek dik açılı başlık
- 1 kapalı SPDT anahtarı 3 pimli 2,54 mm aralık
- Güçlü Siyanoakrilat yapıştırıcı
- Dupont konnektörleri dişi 1P başlık (1 kapalı mavi, 1 kapalı yeşil).
Adım 2: Devrenin Montajı
Devrede şu anda Voltaj Bölücü Devresi (voltmetre) yoktur.
- 4x6cm Çift Taraflı Prototip PCB Evrensel Baskılı Devre Kartını uzun eksen boyunca yarıya kesin.
-
40P erkek başlığı parçalara ayırın:
- 2 kapalı 12P
- 3 kapalı 3P
- 6 kapalı 2P.
-
40P dişi başlığı parçalara ayırın:
- 2 kapalı 12P
- 1 kapalı 6P
- Lehim 2 kapalı 12Pdişi başlık gösterildiği gibi.
- 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
- Diğer tarafta, gösterildiği gibi 6 kapalı 2P, 2 kapalı 3Pmale başlığını ve SPDT anahtarını lehimleyin.
- 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).
- 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.
- PINS #1, #12, #15'e lehimlemede gösterildiği gibi (kırmızı) dişi başlık tarafında 3.3V izleyin.
- 3.3V delikten lehimlenmiş yan (kırmızı) RAW başlık PIN #1.
- Gösterildiği gibi diğer taraftaki PIN #11'den delikten Lehim Dişi pime turuncu kancayı takip edin.
- #20'den #30'a ve #31'den #13 ve #16'ya kadar mavi bağlantı telini takip edin ve lehimleyin.
- Dişi Başlık PIN #11'i delikten Erkek Başlık PIN #11'e lehimleyin.
- 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.
- Mavi Dupont telini #28'e lehimleyin; yeşil Dupont telini #29'a lehimleyin.
- Arduino'nun üst tarafında 6P dişi başlığı sabitleyin ve ardından lehimleyin.
- Arduino'nun üst tarafında 2P dik açılı dişi başlığı int #29 ve #30 sabitleyin ve ardından lehimleyin.
- Arduino'nun alt tarafında 2 / 12P ve 1 kapalı 3P erkek pini sabitleyin ve ardından lehimleyin.
- Arduino erkek 12P pinlerini PCB 12P dişi başlıklara yerleştirin.
3. Adım: MCU'yu Yanıp Sönme
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ı
- Ardiuno Pro Mini'nin PCB üzerindeki başlıklara takıldığından emin olun.
- 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.
- SOLAR TRACKER kontrol kutusu tabanındaki boşluğa 6P Başlık yuvalı Ardiuno Pro Mini + PCB'yi yerleştirin.
- 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.
- 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
Ö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.
-
LDR bağlantılarını (kutupsuz) yukarıdan takın:
- Sağ üst
- Sol üst
- Sağ alt
- Sol alt
-
Servo bağlantılarını (sinyal kablosu solda olacak şekilde) yukarıdan takın:
- Yatay
- Dikey
- 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
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.
- Aşağıdaki komut dosyasını bir D1M WIFI BLOK (veya Wemos D1 Mini) üzerine yükleyin.
- USB'yi PC'den ayırın
-
PIN BAĞLANTILARI:-ve (Kontrolör) => GND (D1M)+ve (Kontrolör) => 3V3 (D1M)SCL (Kontrolör) => D1 (D1M)
SDA (Kontrolör) => D2 (D1M)
- SPDT anahtarını CONFIG konumuna çevirin
- USB'yi PC'ye bağlayın
- Arduino IDE'den doğru COM Portu ile bir konsol penceresi başlatın
- "Newline" ve "9600 baud" öğelerinin seçili olduğundan emin olun
- Komutlar Gönder Metin Kutusuna girilir ve ardından Enter tuşuna basılır
- Komutlar Karakter bayt bayt biçimindedir.
- İkinci bayt (üçüncü bölüm) dahil değilse, komut dosyası tarafından 0 (sıfır) gönderilir
- 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:
USB, EL LAMBASI, BİLEŞEN TEST CİHAZI VE YERLEŞİM ŞARJ CİHAZI İLE TAŞINABİLİR MİNİ ÇOK GERİLİM PSU: 6 Adım
USB, EL LAMBASI, BİLEŞEN TEST CİHAZI VE YERLEŞİM ŞARJ CİHAZI İLE TAŞINABİLİR MİNİ ÇOK GERİLİM PSU: İlk talimat kitabıma hoş geldiniz! Bu talimatla, tehlikeli/ucuz bir güneş enerjisi bankasını (bazı ekstra parçalarla) kullanışlı bir şeye dönüştürebilirsiniz. Benim yaptığım gibi her gün kullanabileceğiniz bir şey, çünkü onu kullanmak gerçekten harika! Çoğu av
WAC (YÜRÜYÜŞ VE ŞARJ CİHAZI) - Eski CD Sürücüsünü Yeniden Kullanma: 6 Adım
WAC (YÜRÜYÜŞ VE ŞARJ CİHAZI) - Eski CD Sürücüsünü Yeniden Kullanma: Herkese merhaba, ben Chris XI sınıfının bir öğrencisiyim ve bu benim ilk ders kitabım. Bu proje benim tarafımdan 11 yaşındayken yapıldı (projelerimi herkese göstermek için yayınlamaya çok utangaçtım)*Herhangi bir hata için özür dilerim. İngilizce benim ana dilim değil
IOT123 - ŞARJ CİHAZI DOKTOR PARÇASI: 3 Adım
IOT123 - ŞARJ CİHAZI DOKTOR ARACILIĞI: SOLAR TRACKER CONTROLLER'ın 0.4 sürümünde hata ayıklarken, multimetreyi farklı NPN anahtar devrelerine bağlamak için çok zaman harcadım. Multimetrenin breadboard dostu bağlantıları yoktu. Aşağıdakiler dahil birkaç MCU tabanlı monitöre baktım
IOT123 - ICOS PANEL DEVRE TEST CİHAZI: 4 Adım
IOT123 - ICOS PANEL DEVRE TEST CİHAZI: ICOS10 ASSİMİLAT SENSÖR HUB'ını geliştirirken, panel devrelerini yapıldıkları gibi doğrulamam gerekiyordu. Ayrıca 3P başlıklarda pinler lehimlenirken, lehimleme sırasında herhangi bir deformasyonu önlemek için 3P erkek pinlerin takılmasını istedim. Ayrıca
IOT123 - IDC KABLO TEST CİHAZI (6 TEL): 3 Adım
IOT123 - IDC CABLE TESTER (6 TELLİ): ICOS10 ASSIMILATE SENSOR HUB'ı geliştirirken, oluşturduğum kabloları doğrulamam gerekiyordu. Doğrulama, soketler arasındaki sürekliliği ve teller arasındaki izolasyonu kontrol etmekti. Geldiğim tasarım arasında geçiş yapmak için kullanılan DIP anahtarları