فهرست مطالب:
- مرحله 1: مواد و ابزارها
- مرحله 2: مونتاژ مدار
- مرحله 3: فلش کردن MCU
- مرحله 4: مونتاژ بدنه مدار
- مرحله 5: اتصال Rig Leads به کنترلر
- مرحله 6: آزمایش کنترلر
- مرحله 7: پیکربندی از طریق I2C با استفاده از ورودی کنسول
- مرحله 8: مراحل بعدی
تصویری: IOT123 - SOLAR TRACKER - CONTROLLER: 8 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:57
این برنامه افزودنی دستورالعمل است
IOT123 - SOLAR TRACKER - TILT/PAN ، PANEL FRAME ، LDR MOUNTS RIG. در اینجا ما بر روی کنترل کننده سروها و سنسورهای موقعیت خورشید تمرکز می کنیم. ذکر این نکته ضروری است که در این طرح 2 MCU مورد استفاده قرار می گیرد: یکی (3.3V 8 مگاهرتز Arduino Pro Mini) برای ردیاب خورشیدی و دیگری MCU مستقل برای سنسورها/بازیگران شما.
این نسخه 0.3 است
به جای انتشار همه پروژه ها پس از رضایت کامل ، من ادغام مداوم را تمرین می کنم و بیشتر اوقات چیزی را ارائه می دهم ، آنچه را که نیاز دارم تحویل می دهم. زمانی که بهینه سازی نرم افزار/سخت افزار کنترل کننده کامل شود ، من یک دستورالعمل آموزشی دیگر برای شارژر باتری خواهم نوشت. من به این نکته اشاره می کنم که در این مرحله بهینه سازی ها در کجا مورد نیاز است.
بخشی از دلیل این روش بازخورد مشتریان است. اگر بچه ها نیاز می بینید یا رویکرد بهتری دارید ، لطفاً نظر دهید ، اما به خاطر داشته باشید که من نمی توانم همه چیز را ارائه دهم و احتمالاً نه در بازه زمانی مناسب شما. از آنجا که این توضیحات کمتر مرتبط به نظر می رسند ، از این مقاله حذف می شوند.
این شامل چه مواردی است:
- از LDR های اصلی Instructable برای تشخیص محل تقریبی خورشید استفاده کنید.
- سروها را به سمت خورشید حرکت دهید.
- گزینه هایی برای حساسیت حرکات.
- گزینه هایی برای اندازه گام هنگام حرکت به سمت خورشید.
- گزینه هایی برای محدودیت های زاویه ای استفاده شده در سرویس ها.
- گزینه هایی برای تأخیر حرکات.
-
رابط I2C برای تنظیم/دریافت مقادیر بین MCU ها.
- خواب عمیق بین حرکات.
مواردی که این شامل نمی شود (و در صورت اجازه زمان به آن پرداخته می شود):
- فقط در ساعات روز از برق استفاده کنید.
- به خاطر آوردن موقعیت سپیده دم و رفتن در آنجا هنگام غروب.
- حذف تنظیم کننده از MCU.
- غیرفعال کردن LED ها در MCU.
- تغییر مسیر نیرو از طریق VCC به جای RAW.
- ارائه راهکارهایی برای چشمک زدن بدون برق تنظیم شده از مبدل USB به سریال TTL.
- مانیتور ولتاژ باتری.
تاریخ
20 دسامبر 2017 کد V0.1
نسخه اولیه منبع نور را روشن می کند ، همیشه روشن است ، بدون شارژ
7 ژانویه 2018 کد V0.2
-
تغییرات سخت افزاری
- پین های I2C را اضافه کنید
- سوئیچ را به GND های سروو اضافه کنید
- برچسب چاپ شده روی جعبه کنترلر
-
تغییرات نرم افزار
- پیکربندی را از EEPROM بخوانید
- پشتیبانی از گذرگاه I2C به عنوان برده MCU دیگر (3.3V)
- تنظیمات را از طریق I2C تنظیم کنید
-
تنظیم را از طریق I2C فعال کنید
- پیکربندی را از طریق I2C دریافت کنید
- خواص زمان اجرا را از طریق I2C دریافت کنید (فعلاً فعال است و شدت نور فعلی)
- حذف گزارش ورود به سیستم (روی مقادیر I2C تأثیر می گذارد)
19 ژانویه 2018 کد V0.3
-
سخت افزار
برچسب به روز شد Switch اکنون برای انتخاب حالت CONFIG یا TRACK استفاده می شود
-
نرم افزار
- I2C فقط برای پیکربندی استفاده می شود
- کنترل کننده 5 ثانیه قبل از شروع ردیابی منتظر می ماند و امکان حرکت دست ها را فراهم می کند
- برای استفاده از پیکربندی I2C ، SPDT باید به عنوان واحد بوت در CONFIG باشد
- در بین حرکت ردیابی ، واحد در حالت خواب عمیق برای مقدار پیکربندی SLEEP MINUTES (به طور پیش فرض 20 دقیقه) است.
مرحله 1: مواد و ابزارها
در حال حاضر یک لیست کامل از مواد و منابع وجود دارد.
- قطعات چاپ سه بعدی
- آردوینو پرو مینی 3.3 ولت 8 مگاهرتز
- 1 از 4x6cm نمونه اولیه دو طرفه مدار چاپی مدار چاپی (برای نصف شدن)
- 1 سربرگ مردانه 40P (به اندازه برش داده می شود).
- 1 سربرگ زن 40P (به اندازه برش داده می شود).
- 4 ایستگاه 10K 1/4W خاموش.
- سیم اتصال.
- لحیم و آهن.
- 20 پیچ با قابلیت ضربه زدن روی سر تخت ضد زنگ 4G 6 6 میلی متر.
- 4 پیچ 4G 6 6 میلی متر ضد زنگ ضد زنگ پیچ.
- 1 عدد باتری 3.7 ولت LiPo و نگهدارنده (خاتمه در اتصالات dupont 2P).
- هدر زاویه راست نر 1P 2P
- 1 سوئیچ SPDT 3 پایه 2.54 میلی متری
- چسب قوی سیانوآکریلات
- Dupont کانکتورهای زن 1P هدر (1 عدد آبی ، 1 خاموش سبز).
مرحله 2: مونتاژ مدار
این مدار در حال حاضر دارای مدار تقسیم ولتاژ (ولت متر) نیست.
- تخته مدار چاپی دوطرفه PCB نمونه دو طرفه 4x6 سانتی متر را در طول محور طولانی به نصف برسانید.
-
سربرگ مرد 40P را به قطعات تقسیم کنید:
- 2 تخفیف 12P
- 3 تخفیف 3P
- 6 تخفیف 2P
-
هدر زن 40P را به قطعات تقسیم کنید:
- 2 تخفیف 12P
- 1 تخفیف 6P
- Solder 2 off 12Peder عنوان زن مانند تصویر.
- اسپیسر جدا شده از یک سربرگ 3P (اضافی) را به قسمت زیرین سوئیچ SPDT با چسب سیانوآکریلات بچسبانید
- در طرف دیگر ، 6 سرپیچ 2P ، 2 خاموش 3Pmale و سوئیچ SPDT را مانند تصویر لحیم کنید.
- 4 مقاومت 10K (A ، B ، C ، D سیاه) از طریق سرب به سربرگ GND (شماره 2 مشکی) و پین های سربرگ A0 - A3 (شماره 5 ، #6 ، #7 ، #8) و سپس از طریق سوراخ (زرد) همانطور که نشان داده شده است (3 عکس + 1 نمودار).
- 3.3V را از پین های لحیم کاری LDR PINS #4 ، #6 ، #8 ، #10 ردیابی کرده و در پین VCC سربرگ اصلی (سبز) سوراخ کنید.
- 3.3V را در قسمت سربرگ زن دنبال کنید (به رنگ قرمز) به PINS #1 ، #12 ، #15 لحیم می شود.
- 3.3V از طریق سوراخ ، پین شماره 1 سربرگ RAW (قرمز) لحیم شده است.
- مطابق شکل ، اتصال نارنجی را از PIN #11 از طریق سوراخ انجام دهید تا پین زن را در طرف دیگر لحیم کنید.
- سیم اتصال آبی را از شماره 20 تا #30 و از شماره 31 تا #13 و #16 ردیابی و لحیم کنید.
- سرصفحه سربر زن PIN #11 به سربرگ PIN #11 از طریق سوراخ.
- 2 کانکتور dupont به طول 30 میلی متر با هدر زنانه 1P (1 رنگ آبی ، 1 رنگ سبز) آماده کنید. نوار و قلع سر دیگر.
- سیم Dupont آبی را به شماره 28 لحیم کنید. سیم سبز Dupont را به شماره 29 لحیم کنید.
- در قسمت بالای آردوینو ، هدر زن 6P را محکم کرده و سپس لحیم کنید.
- در قسمت بالای آردوینو ، سربرگ زن با زاویه راست 2P int #29 و #30 و سپس لحیم کنید.
- در قسمت زیرین آردوینو ، 2 پین نر 12P و 1 پک 3P نر را محکم کرده و سپس لحیم کنید.
- پین های 12P آردوینو نر را در هدرهای زن PCB 12P وارد کنید.
مرحله 3: فلش کردن MCU
Arduino Pro Mini به راحتی با استفاده از مبدل USB به TTL FTDI232 با استفاده از هدر زن 6P فلش می شود. برای تراز کردن 2 تخته به عکس بالا مراجعه کنید.
اطمینان حاصل کنید که تنظیمات 3.3V در FTDI232 شما انتخاب شده است. دستورالعمل های اینجا را با استفاده از کد زیر دنبال کنید (از پیوند GIST استفاده کنید).
کتابخانه کم توان (پیوست شده و https://github.com/rocketscream/Low-Power) باید نصب شود.
هنگامی که Arduino Pro Mini + PCB در بدنه نصب می شود ، همچنان می توان فاش کرد زیرا پین های هدر در معرض دید قرار گرفته اند. فقط کافیست Controller Unit را از Panel Frame جدا کرده و هدر را نمایان کنید.
ردیاب خورشیدی شیب دار با پیکربندی I2C/EEPROM و چرخه خواب بین حرکات. مدت زمان چرخه خواب با افزایش مدت زمان کاهش می یابد ، اما برای این منظور کافی است
/* |
* اصلاح شده از کد |
* توسط ماتیاس لروی |
* |
* تغییرات V0.2 |
** I2C SET GET |
** EEPROM SET GET |
** حذف خروجی سریال - متاثر از I2C |
** فعال/غیرفعال کردن ردیابی |
** سرویس ها را از طریق I2C به محدودیت ها منتقل کنید |
** از طریق I2C شدت فعلی AVG را بخوانید |
* تغییرات V0.3 |
** سوئیچ برای 2 حالت - TRACK (NO I2C) و پیکربندی (از I2C استفاده می کند) |
** در حالت پیگیری بخوابید (به دلیل 8 تکه دوم بسیار دقیق) |
** DERACH/ATTACH SERVOS در خواب/بیدار (ترانزیستور به طور اتفاقی استفاده می شود) |
** حذف موقعیت اولیه قابل تنظیم (اضافی) |
** حذف پیکربندی بیداری ثانیه (اضافی) |
** حذف قابل تنظیم/غیرفعال کردن (اضافی) |
** حذف ردیاب پیکربندی فعال (استفاده از سوئیچ سخت افزار) |
** حذف ولتاژ - آیا از کامپوننت جداگانه I2C استفاده خواهید کرد |
** درصورت عدم استفاده از I2C ، ورود به سیستم را اضافه کنید |
*/ |
#عبارتند از |
#عبارتند از |
#عبارتند از |
#عبارتند از |
#عبارتند از |
#defineEEPROM_VERSION1 |
#defineI2C_MSG_IN_SIZE3 |
#تعریف PIN_LDR_TL A0 |
#تعریفPIN_LDR_TR A1 |
#تعریف PIN_LDR_BR A3 |
#تعریف PIN_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 // میانگین همه LDRS |
#defineIDX_DUSK_INTENSITY13 // میانگین همه LDRS |
#defineIDX_END_EEPROM_SET14 |
#defineIDX_CURRENT_INTENSITY15 // میانگین همه LDRS - برای محاسبه نور غیر مستقیم محیطی IDX_DAWN_INTENSITY استفاده می شود |
#defineIDX_END_VALUES_GET16 |
#defineIDX_SIGN_117 |
#defineIDX_SIGN_218 |
#defineIDX_SIGN_319 |
سرو _servoH؛ |
Servo _servoV؛ |
بایت _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 _angleH = 90 ؛ |
int _angleV = 90 ؛ |
int _averageTop = 0؛ |
int _averageRight = 0 ؛ |
int _averageBottom = 0؛ |
int _averageLeft = 0؛ |
بایت _i2cResponse = 0؛ |
bool _inConfigMode = false؛ |
voidsetup () |
{ |
Serial.begin (115200) ؛ |
getFromEeprom ()؛ |
if (inConfigMode ()) { |
Serial.println ("حالت پیکربندی") ؛ |
Serial.print ("آدرس I2C:") ؛ |
Serial.println (_i2cVals [IDX_I2C_ADDR]) ؛ |
Wire.begin (_i2cVals [IDX_I2C_ADDR]) ؛ |
Wire.onReceive (ReceEvent) ؛ |
Wire.onRequest (requestEvent) ؛ |
} دیگری { |
Serial.println ("حالت ردیابی") ؛ |
تاخیر (5000) ؛ // زمان خارج شدن از دست در صورت اتصال باتری و غیره |
} |
} |
voidloop () |
{ |
getLightValues ()؛ |
اگر (! _inConfigMode) { |
// ToDo: TRANSISTOR SWITCH را روشن کنید |
_servoH.attach (PIN_SERVO_H) ؛ |
_servoV.attach (PIN_SERVO_V) ؛ |
برای (int i = 0 ؛ i <20؛ i ++) { |
اگر (من! = 0) { |
getLightValues ()؛ |
} |
moveServos ()؛ |
} |
تأخیر (500) ؛ |
_servoH.detach ()؛ |
_servoV.detach ()؛ |
// ToDo: خاموش کردن ترانزیستور سوئیچ |
تأخیر (500) ؛ |
asleepFor ((_ _ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8) ؛ |
} |
} |
// --------------------------------- حالت فعلی |
boolinConfigMode () { |
pinMode (PIN_SERVO_H ، INPUT) ؛ |
_inConfigMode = digitalRead (PIN_SERVO_H) == 1 ؛ |
return _inConfigMode؛ |
} |
// --------------------------------- EEPROM |
voidgetFromEeprom () { |
اگر ( |
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") ؛ |
برای (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") ؛ |
برای (int i = 0؛ i <IDX_END_EEPROM_SET؛ i ++) { |
_i2cVals = EEPROM.read (i) ؛ |
//Serial.println(String(i) + "=" + _i2cVals )؛ |
} |
} |
// --------------------------------- I2C |
voidreceiveEvent (int count) { |
اگر (تعداد == I2C_MSG_IN_SIZE) |
{ |
char cmd = Wire.read ()؛ |
شاخص بایت = Wire.read ()؛ |
مقدار بایت = Wire.read ()؛ |
تغییر (cmd) { |
case'G ': |
if (فهرست <IDX_END_VALUES_GET) { |
_i2cResponse = _i2cVals [فهرست] ؛ |
} |
زنگ تفريح؛ |
case'S ': |
if (فهرست <IDX_END_EEPROM_SET) { |
_i2cVals [index] = مقدار ؛ |
EEPROM.update (index، _i2cVals [index]) ؛ |
} |
زنگ تفريح؛ |
پیش فرض: |
برگشت؛ |
} |
} |
} |
voidrequestEvent () |
{ |
Wire.write (_i2cResponse) ؛ |
} |
// --------------------------------- LDR |
voidgetLightValues () { |
int valueTopLeft = analogRead (PIN_LDR_TL) ؛ |
int valueTopRight = analogRead (PIN_LDR_TR)؛ |
int valueBottomRight = analogRead (PIN_LDR_BR)؛ |
int valueBottomLeft = analogRead (PIN_LDR_BL) ؛ |
_averageTop = (valueTopLeft + valueTopRight) / 2؛ |
_averageRight = (valueTopRight + valueBottomRight) / 2 ؛ |
_averageBottom = (valueBottomRight + valueBottomLeft) / 2؛ |
_averageLeft = (valueBottomLeft + valueTopLeft) / 2؛ |
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4؛ |
_i2cVals [IDX_CURRENT_INTENSITY] = نقشه (میانگین شدت ، 0 ، 1024 ، 0 ، 255) ؛ |
} |
// --------------------------------- سروها |
voidmoveServos () { |
Serial.println ("moveServos") ؛ |
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) { |
// رفتن به چپ |
Serial.println ("moveServos رفتن به چپ")؛ |
تاخیر (_slowingDelay) ؛ |
برای (int i = 0؛ i <_i2cVals [IDX_H_STEP] ؛ i ++) { |
_servoH.write (_angleH--)؛ |
تاخیر (_servoLoopDelay) ؛ |
} |
} |
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) { |
// راست رفتن |
Serial.println ("moveServos رفتن به چپ")؛ |
تاخیر (_slowingDelay) ؛ |
برای (int i = 0؛ i <_i2cVals [IDX_H_STEP] ؛ i ++) { |
_servoH.write (_angleH ++) ؛ |
تاخیر (_servoLoopDelay) ؛ |
} |
} |
دیگری { |
// کاری انجام ندادن |
Serial.println ("moveServos انجام هیچ کاری") ؛ |
تاخیر (_slowingDelay) ؛ |
} |
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) { |
// بالا رفتن |
Serial.println ("moveServos going up")؛ |
تاخیر (_slowingDelay) ؛ |
برای (int i = 0؛ i <_i2cVals [IDX_V_STEP] ؛ i ++) { |
_servoV.write (_angleV ++) ؛ |
تاخیر (_servoLoopDelay) ؛ |
} |
} |
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) { |
// پایین رفتن |
Serial.println ("moveServos going down") ؛ |
تاخیر (_slowingDelay) ؛ |
برای (int i = 0؛ i <_i2cVals [IDX_V_STEP] ؛ i ++) { |
_servoV.write (_angleV--) ؛ |
تاخیر (_servoLoopDelay) ؛ |
} |
} |
دیگری { |
Serial.println ("moveServos انجام هیچ کاری") ؛ |
تاخیر (_slowingDelay) ؛ |
} |
} |
//---------------------------------خواب |
voidasleepFor (بدون امضا هشت قسمت دوم) { |
Serial.println ("در خواب برای") ؛ |
for (unsignint sleepCounter = هشتSecondSegment ؛ sleepCounter> 0 ؛ sleepCounter--) |
{ |
LowPower.powerDown (SLEEP_8S ، ADC_OFF ، BOD_OFF) ؛ |
} |
} |
مشاهده rawtilt_pan_tracker_0.3.ino میزبان با ❤ توسط GitHub
مرحله 4: مونتاژ بدنه مدار
- اطمینان حاصل کنید که Ardiuno Pro Mini در سربرگ های PCB درج شده است.
- پایه جعبه کنترل کننده SOLAR TRACKER را در دیوارهای جعبه کنترل کننده SOLAR TRACKER قرار دهید و با 2 پیچ ضد زنگ ضد زنگ ضد زنگ 4G 6 6 میلیمتری روی آن چسبانید.
- Ardiuno Pro Mini + PCB را با 6P Header در شکاف داخل جعبه کنترلر SOLAR TRACKER قرار دهید.
- درب جعبه کنترل کننده SOLAR TRACKER را در دیوارهای جعبه کنترل کننده SOLAR TRACKER قرار دهید و با 2 پیچ ضد زنگ ضد زنگ ضد زنگ 4G 6 6 میلیمتری روی آن چسبانید.
- مونتاژ را در بالا به پایه قاب پانل با 4 پیچ 4G x 6mm ضد زنگ ضد زنگ ضد ضربه خود نصب کنید.
مرحله 5: اتصال Rig Leads به کنترلر
اتصالات مربوطه آماده از دستورالعمل قبلی ، 4 اتصال 2P LDR و 2 اتصال 3P خاموش از سرووها هستند. آنچه موقت است تا زمان شارژ مجدد آماده شود ، باتری است. در حال حاضر از LiPo 3.7V استفاده کنید که در اتصال 2P DuPont خاتمه می یابد.
-
اتصالات LDR (بدون قطب) را از بالا وارد کنید:
- بالا سمت راست
- بالا سمت چپ
- سمت راست پایین
- پایین سمت چپ
-
اتصالات سروو (با سیم سیگنال به سمت چپ) را از بالا وارد کنید:
- افقی
- عمودی
- منتظر بمانید تا برای آزمایش سپس: 3.7V DC Power power +ve را به بالا ، -ve را به پایین وارد کنید.
مرحله 6: آزمایش کنترلر
همانطور که قبلاً گفته شد ، نرم افزار برای گردش کار شارژ خورشیدی بهینه نشده است. می توان آن را با استفاده از منابع نور طبیعی (خورشید) و غیر طبیعی آزمایش و تنظیم کرد.
برای آزمایش ردیابی در یک محیط کنترل شده ، ممکن است راحت باشد که SLEEP MINUTES را روی مقدار کمتری تنظیم کنید (مرحله بعدی را ببینید).
مرحله 7: پیکربندی از طریق I2C با استفاده از ورودی کنسول
این پیکربندی کنترل کننده از طریق MCU دوم و وارد کردن تنظیمات در پنجره کنسول را توضیح می دهد.
- اسکریپت زیر را روی D1M WIFI BLOCK (یا Wemos D1 Mini) بارگذاری کنید.
- USB را از رایانه جدا کنید
-
اتصالات پین: -ve (Controller) => GND (D1M)+ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)
SDA (کنترل کننده) => D2 (D1M)
- کلید SPDT را به CONFIG برگردانید
- USB را به رایانه وصل کنید
- از Arduino IDE یک پنجره کنسول با پورت COM مناسب شروع کنید
- مطمئن شوید "Newline" و "9600 baud" انتخاب شده اند
- دستورات وارد Sendbox می شوند و سپس کلید Enter را وارد می کنند
- دستورات در قالب Character byte byte هستند
- اگر بایت دوم (بخش سوم) گنجانده نشده باشد 0 (صفر) توسط اسکریپت ارسال می شود
- در استفاده از ورودی سریال دقت کنید ؛ قبل از زدن کلید "Enter" آنچه را وارد کرده اید مرور کنید. اگر قفل شده اید (برای مثال تغییر آدرس I2C به مقداری که فراموش کرده اید) باید دوباره سیستم عامل کنترلر را فلش کنید.
تغییرات پشتیبانی شده در اولین فرمان عبارتند از:
- E (فعال کردن ردیابی سروو) برای توقف حرکت در هنگام پیکربندی مفید است. این با استفاده از: E 0 وارد می شود
- D (غیرفعال کردن ردیابی سروو) در صورت عدم راه اندازی مجدد دستگاه ، برای شروع ردیابی خودکار مفید است. این با استفاده از: D 0 وارد می شود
- G (دریافت مقدار پیکربندی) مقادیر EEPROM و IN -MEMORY را می خواند: این ورودی با استفاده از: G (شاخص مقدار بایت 0 - 13 و 15 معتبر است)
- S (تنظیم مقدار EEPROM) مقادیری را به EEPROM تنظیم می کند که پس از راه اندازی مجدد در دسترس هستند. این با استفاده از S وارد می شود
کد نقطه حقیقت نمایه ها است ، اما موارد زیر برای راهنمای ارزشها/نظرات معتبر استفاده می شود:
- I2C ADDRESS 0 - آدرس برده کنترل کننده ، استاد برای برقراری ارتباط با کنترلر به این مورد نیاز دارد (پیش فرض 10)
- حداقل زاویه عمودی 1 - زاویه سروو عمودی حد پایین (به طور پیش فرض 10 ، محدوده 0 - 180)
- حداکثر زاویه عمودی 2 - زاویه بالای سروو عمودی (به طور پیش فرض 170 ، محدوده 0 - 180)
- SENSITIVITY VERTICAL LDR 3 - حاشیه خواندن LDR عمودی (پیش فرض 20 ، محدوده 0 - 1024)
- مرحله زاویه عمودی 4 - گام های سروو عمودی زاویه ای در هر تنظیم (پیش فرض 5 ، محدوده 1 - 20)
- حداقل زاویه افقی 5 - زاویه افقی سروو افقی پایین (به طور پیش فرض 10 ، محدوده 0 - 180)
- حداکثر زاویه افقی 6 - زاویه سروو افقی بالا (به طور پیش فرض 170 ، محدوده 0 - 180)
- SENSITIVITY HORIZONTAL LDR 7 - حاشیه خواندن LDR افقی (پیش فرض 20 ، محدوده 0 - 1024)
- گام زاویه افقی 8 - گام های سروو افقی زاویه ای در هر تنظیم (پیش فرض 5 ، محدوده 1 - 20)
- SLEEP MINUTES 9 - مدت زمان تقریبی خواب بین ردیابی (پیش فرض 20 ، محدوده 1 - 255)
- زاویه عمودی 10 زاویه - استفاده از آینده - زاویه عمودی برای بازگشت به هنگام غروب خورشید
- زاویه افقی افقی 11 - استفاده در آینده - زاویه افقی برای بازگشت به هنگام غروب خورشید
- شدت داغ 12 - استفاده از آینده - حداقل میانگین تمام LDR هایی که باعث شروع ردیابی روزانه خورشید می شوند
- شدت غروب 13 - استفاده در آینده - حداقل میانگین تمام LDR هایی که باعث ردیابی روزانه خورشید می شود
- پایان ارزش EEPROM نشانگر 14 - ارزش استفاده نمی شود
- شدت فعلی 15 - درصد متوسط فعلی شدت نور
- پایان مقادیر در حافظه 16 نشانگر - ارزش استفاده نمی شود.
ورودی سریال (ورودی صفحه کلید در پنجره کنسول) را ضبط می کند و آن را به فرمت I2C با فرمت char ، byte ، byte ارسال می کند
#عبارتند از |
#defineI2C_MSG_IN_SIZE2 |
#defineI2C_MSG_OUT_SIZE3 |
#defineI2C_SLAVE_ADDRESS10 |
boolean _newData = false؛ |
const byte _numChars = 32؛ |
char _receivedChars [_numChars]؛ // آرایه ای برای ذخیره داده های دریافتی |
voidsetup () { |
Serial.begin (9600)؛ |
Wire.begin (D2 ، D1) ؛ |
تأخیر (5000) ؛ |
} |
voidloop () { |
recvWithEndMarker ()؛ |
parseSendCommands ()؛ |
} |
voidrecvWithEndMarker () { |
بایت ساکن ndx = 0؛ |
char endMarker = '\ n'؛ |
char rc؛ |
while (Serial.available ()> 0 && _newData == false) { |
rc = Serial.read ()؛ |
if (rc! = endMarker) { |
_receivedChars [ndx] = rc؛ |
ndx ++ ؛ |
if (ndx> = _numChars) { |
ndx = _numChars - 1 ؛ |
} |
} دیگری { |
_receivedChars [ndx] = '\ 0'؛ // خاتمه رشته |
ndx = 0 ؛ |
_newData = true؛ |
} |
} |
} |
voidparseSendCommands () { |
if (_newData == true) { |
constchar delim [2] = ""؛ |
char *token؛ |
token = strtok (_receivedChars ، delim) ؛ |
char cmd = _receivedChars [0]؛ |
شاخص بایت = 0؛ |
مقدار بایت = 0؛ |
int i = 0 ؛ |
while (token! = NULL) { |
//Serial.println (گفته شده) ؛ |
من ++ ؛ |
تغییر (i) { |
مورد 1: |
token = strtok (NULL ، delim) ؛ |
index = atoi (توکن) ؛ |
زنگ تفريح؛ |
مورد 2: |
token = strtok (NULL ، delim) ؛ |
if (نشانه! = NULL) { |
ارزش = atoi (توکن) ؛ |
} |
زنگ تفريح؛ |
پیش فرض: |
توکن = NULL؛ |
} |
} |
sendCmd (cmd ، index ، value) ؛ |
_newData = false؛ |
} |
} |
voidsendCmd (char cmd ، شاخص بایت ، مقدار بایت) { |
Serial.println ("-----") ؛ |
Serial.println ("ارسال فرمان:") ؛ |
Serial.println ("\ t" + رشته (cmd) + "" + رشته (فهرست) + "" + رشته (مقدار)) ؛ |
Serial.println ("-----") ؛ |
Wire.beginTransmission (I2C_SLAVE_ADDRESS) ؛ // انتقال به دستگاه |
Wire.write (cmd) ؛ // یک کاراکتر ارسال می کند |
Wire.write (index) ؛ // یک بایت ارسال می کند |
Wire.write (مقدار) ؛ // یک بایت ارسال می کند |
Wire.endTransmission ()؛ |
پاسخ بایت = 0 ؛ |
bool hadResponse = false؛ |
if (cmd == 'G') { |
سیم. درخواست از (I2C_SLAVE_ADDRESS ، 1) ؛ |
در حالی که (Wire.available ()) // slave ممکن است کمتر از درخواست ارسال کند |
{ |
hadResponse = true؛ |
respond = Wire.read ()؛ |
} |
if (hadResponse == true) { |
Serial.println ("دریافت پاسخ:")؛ |
Serial.println (پاسخ) ؛ |
} دیگری { |
Serial.println ("بدون پاسخ ، آدرس/اتصال را بررسی کنید") ؛ |
} |
} |
} |
مشاهده rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino میزبانی شده توسط ❤ توسط GitHub
مرحله 8: مراحل بعدی
برای بررسی تغییرات نرم افزاری/سخت افزاری به صورت دوره ای مراجعه کنید.
نرم افزار/سخت افزار را مطابق نیاز خود تغییر دهید.
در مورد هر گونه درخواست/بهینه سازی نظر دهید.
توصیه شده:
آموزش LoRa GPS Tracker - LoRaWAN با Dragino و TTN: 7 مرحله
آموزش LoRa GPS Tracker | LoRaWAN با Dragino و TTN: هی ، چه خبر ، بچه ها! Akarsh اینجا از CETech. چند پروژه قبلی ما نگاهی به دروازه LoRaWAN از Dragino داشتیم. ما گره های مختلف را به Gateway متصل کردیم و داده ها را از گره ها به Gateway با استفاده از TheThingsNetwork به عنوان s ارسال کردیم
DIY GPS Tracker --- برنامه پایتون: 5 مرحله (همراه با تصاویر)
DIY GPS Tracker --- برنامه پایتون: من دو هفته پیش در یک رویداد دوچرخه سواری شرکت کردم. پس از اتمام کار ، می خواستم مسیر و سرعتی را که در آن زمان حرکت می کردم بررسی کنم. متأسفانه به نتیجه نرسید. اکنون من از ESP32 برای ساخت ردیاب GPS استفاده می کنم و از آن برای ثبت مسیر دوچرخه سواری خود استفاده می کنم
ساعت هوشمند DIY Fitness Tracker با اکسی متر و ضربان قلب - ماژول های الکترونیکی مدولار از TinyCircuits - کوچکترین بازی: 6 مرحله
ساعت هوشمند DIY Fitness Tracker با اکسی متر و ضربان قلب | ماژول های الکترونیکی مدولار از TinyCircuits | کوچکترین بازی: هی ، چه خبر ، بچه ها! Akarsh در اینجا از CETech. امروز ما برخی از ماژول های حسگر را با خود داریم که در زندگی روزمره ما بسیار مفید هستند ، اما در نسخه کوچکی از آنها هستند. اندازه سنسورهایی که امروزه در اختیار داریم در مقایسه با تراشه بسیار کوچک است
دستکش Etextile VR برای Vive Tracker: 13 مرحله (همراه با تصاویر)
دستکش Etextile VR برای Vive Tracker: این آموزش به شما نحوه ساخت دستکش etextile برای استفاده در VR با ردیاب Vive را نشان می دهد. آنها جوی استیک هایی را که برای Vive طراحی شده اند جایگزین می کنند ، و تعاملات VR را بیشتر لمسی و انسانی می کند. به آنها دستکش "mudra" می گویند زیرا شما شاخص را فشرده می کنید و
Movie Tracker - Raspberry Pi Powered Theatrical Release Tracker: 15 مرحله (همراه با تصاویر)
Movie Tracker - Raspberry Pi Powered Theatrical Release Tracker: Movie Tracker یک قالب ردیابی است که به شکل clapperboard ساخته شده و دارای قدرت رزبری پای است. از TMDb API برای چاپ پوستر ، عنوان ، تاریخ اکران و نمای کلی فیلم های آینده در منطقه شما ، در یک بازه زمانی مشخص (به عنوان مثال ، فیلم های منتشر شده این هفته) در