Съдържание:

IOT123 - СЛЪНЧЕН ПРОСЛЕДИТЕЛ - КОНТРОЛЕР: 8 стъпки
IOT123 - СЛЪНЧЕН ПРОСЛЕДИТЕЛ - КОНТРОЛЕР: 8 стъпки

Видео: IOT123 - СЛЪНЧЕН ПРОСЛЕДИТЕЛ - КОНТРОЛЕР: 8 стъпки

Видео: IOT123 - СЛЪНЧЕН ПРОСЛЕДИТЕЛ - КОНТРОЛЕР: 8 стъпки
Видео: IOT123 - BYKO LIVE RIDE 2024, Юли
Anonim
Image
Image
IOT123 - СЛЪНЧЕВ ПРОСЛЕДИТЕЛ - КОНТРОЛЕР
IOT123 - СЛЪНЧЕВ ПРОСЛЕДИТЕЛ - КОНТРОЛЕР
IOT123 - СЛЪНЧЕВ ПРОСЛЕДИТЕЛ - КОНТРОЛЕР
IOT123 - СЛЪНЧЕВ ПРОСЛЕДИТЕЛ - КОНТРОЛЕР

Това е разширение на Instructable

IOT123 - СЛЪНЧЕВО ПРОСЛЕДВАНЕ - НАКЛЮЧВАНЕ/ПАН, ПАНЕЛНА РАМКА, LDR МОНТИ РИГ. Тук се концентрираме върху контролера на сервомоторите и сензорите за позицията на слънцето. Важно е да се отбележи, че този дизайн предполага, че ще бъдат използвани 2 MCU: един (3.3V 8mHz Arduino Pro Mini) за слънчевия тракер и един независим MCU за вашите сензори/актьори.

Това е версия 0.3

Вместо да публикувам всички проекти след пълно удовлетворение, ще практикувам непрекъсната интеграция и ще доставям нещо по -често, променяйки това, което съм доставил според нуждите си. Ще напиша друга инструкция за зарядното устройство за батерии, _ когато_ оптимизацията на софтуера/хардуера на контролера приключи. Ще посоча къде са необходими оптимизациите, докато пристъпваме през това.

Част от причината за този подход е обратната връзка с клиентите. Момчета, ако виждате нужда или имате по-добър подход, моля, коментирайте, но имайте предвид, че не мога да доставя всичко и евентуално не в срок, който ви подхожда. Тъй като тези обяснения изглеждат по -малко уместни, те ще бъдат изтрити от тази статия.

Какво включва това:

  1. Използвайте LDR от оригиналния Instructable, за да усетите приблизителното местоположение на слънцето.
  2. Преместете сервомоторите към слънцето.
  3. Опции за чувствителността на движенията.
  4. Опции за размера на стъпката при преместване на слънце.
  5. Опции за ъгловите ограничения, използвани на сервомоторите.
  6. Възможности за забавяне на движенията.
  7. I2C интерфейс за настройка/получаване на стойности между MCU.
  8. Дълбок сън между движенията.

Какво не включва (и ще бъде разгледано като времето позволява):

  1. Използва се само през деня.
  2. Спомняйки си позицията на зората и отивайки там при затъмнение.
  3. Премахване на регулатора от MCU.
  4. Деактивиране на LED (и) на MCU.
  5. Пренасочване на захранването чрез VCC, а не RAW.
  6. Осигуряване на заобиколни решения за мигане без регулирано захранване от USB към сериен TTL конвертор.
  7. Монитор на напрежението на батерията.

ИСТОРИЯ

20 декември 2017 г. V0.1 КОД

Първоначалната версия проследява източника на светлина, винаги включен, без зареждане

7 януари 2018 г. V0.2 КОД

  • ИЗМЕНЕНИЯ НА ХАРАКТЕРИСТИКАТА

    • Добавете I2C щифтове
    • Добавете превключвател към серво GND
    • Отпечатан етикет върху панела на контролера
  • ПРОМЕНИ НА СОФТУЕРА

    • Прочетете конфигурацията от EEPROM
    • Поддръжка на I2C шина като роб към друг MCU (3.3V)
    • Задайте конфигурация чрез I2C
    • Задайте Enabled чрез I2C
    • Вземете конфигурация чрез I2C
    • Вземете свойства за изпълнение по време на I2C (понастоящем активирано и текуща интензивност на светлината)
    • Премахване на серийно регистриране (това засегна стойностите на I2C)

19 януари 2018 г. V0.3 КОД

  • ХАРАКТЕРИСТИКИ

    Етикетът е актуализиран. Превключвателят вече се използва за избор на режим CONFIG или TRACK

  • СОФТУЕР

    • I2C се използва само за конфигуриране
    • Контролерът изчаква 5 секунди, преди да инициализира проследяването, позволява да се движат ръцете
    • За да използвате I2C конфигурация, SPDT трябва да е на CONFIG като единични обувки
    • Между проследяването на движението, устройството е в режим на дълбок сън за конфигурационна стойност SLEEP MINUTES (по подразбиране 20 минути).

Стъпка 1: Материали и инструменти

Материали и инструменти
Материали и инструменти
Материали и инструменти
Материали и инструменти
Материали и инструменти
Материали и инструменти

Сега има пълен списък на материалите и източниците.

  1. 3D отпечатани части.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 от 4x6cm двустранна прототипна печатна платка универсална печатна платка (за разреза наполовина)
  4. 1 от 40P мъжки хедър (за изрязване по размер).
  5. 1 от 40P женска заглавка (за подрязване по размер).
  6. 4 изключени 10K 1/4W резистора.
  7. Тел за свързване.
  8. Припой и желязо.
  9. 20 самозатягащи се винтове с неръждаема глава с неръждаема глава.
  10. 4 изключени самонарезни винтове от неръждаема стомана 4G x 6 мм.
  11. 1 изключване 3.7V LiPo батерия и държач (завършващ в 2P dupont конектори).
  12. 1 изключване 2P мъжка права ъглова глава
  13. 1 изключване SPDT превключвател 3 пинов 2,54 мм стъпка
  14. Силно цианоакрилатно лепило
  15. Конектори Dupont женски 1P заглавие (1 изключено синьо, 1 изключено зелено).

Стъпка 2: Сглобяване на веригата

Сглобяване на веригата
Сглобяване на веригата
Сглобяване на веригата
Сглобяване на веригата
Сглобяване на веригата
Сглобяване на веригата

В момента веригата няма верига на делителя на напрежение (волтметър).

  1. Нарежете 4x6 см двустранна прототипна печатна платка универсална печатна платка наполовина по дългата ос.
  2. Нарежете 40P мъжки хедър на парчета:

    1. 2 от 12P
    2. 3 от 3P
    3. 6 от 2P.
  3. Нарежете женската глава 40P на парчета:

    1. 2 от 12P
    2. 1 от 6P
  4. Запояване 2 изключено 12P женска заглавка, както е показано.
  5. Залепете дистанционера, отстранен от 3P мъжки (допълнителен) хедър върху долната страна на SPDT превключвателя с цианоакрилатно лепило
  6. От другата страна поставете тогава спойка 6 на 2P, 2 изключена 3Pmale заглавка и SPDT превключвателя, както е показано.
  7. Запоявайте 4 от 10K резистора (A, B, C, D черен) чрез проводник към щифта GND (#2 черен) и към A0 - A3 щифтове (#5, #6, #7, #8) след това през отвора (жълто), както е показано (3 снимки + 1 диаграма).
  8. Проследете 3.3V от LDR PINS запояване PINS #4, #6, #8, #10 и резба през отвора към VCC щифта на женската глава (зелен).
  9. Проследете 3.3V от женската страна на заглавката, както е показано (червено) запояване към PINS #1, #12, #15.
  10. 3.3V през отвор, запоен над страната (червен) RAW заглавие PIN #1.
  11. Проследете оранжевото свързване от PIN #11 през отвора до запояването Женски щифт от другата страна, както е показано.
  12. Проследяване и запояване на син свързващ проводник от #20 до #30 и от #31 до #13 и #16.
  13. Припой ПИН за женска глава #11 към ПИН за заглавка за мъжка глава #11 през отвор.
  14. Подгответе 2 конектора dupont с дължина 30 мм с женска 1P заглавка (1 изключено в синьо, 1 в зелено). Отделете и калайдайте другия край.
  15. Запояване синя жица Dupont към #28; запояване на зелен проводник Dupont към #29.
  16. От горната страна на Arduino фиксирайте 6P женската заглавка, след което запоявайте.
  17. От горната страна на Arduino фиксирайте 2P женската заглавка под прав ъгъл int #29 и #30, след което запойте.
  18. От долната страна на Arduino фиксирайте 2 от 12P и 1 от 3P мъжки щифтове, след което запоявайте.
  19. Вмъкнете мъжки 12P щифтове на Arduino в женски заглавки на PCB 12P.

Стъпка 3: Мига MCU

Мига MCU
Мига MCU
Мига MCU
Мига MCU
Мига MCU
Мига MCU

Arduino Pro Mini е удобно мигащ с помощта на FTDI232 USB към TTL конвертор, използвайки 6P женска заглавка. Вижте снимката по -горе за подравняване на 2 -те дъски.

Уверете се, че настройката 3.3V е избрана на вашия FTDI232. Следвайте инструкциите тук, като използвате кода по -долу (използвайте връзката към GIST).

Библиотеката с ниска мощност (приложена и https://github.com/rocketscream/Low-Power) трябва да бъде инсталирана.

След като платката Arduino Pro Mini + е инсталирана в корпуса, тя все още може да мига, когато щифтовете на заглавката са изложени. Просто изключете контролера от рамката на панела, излагайки заглавката.

Слънчев тракер с накланящ се тиган с конфигурация I2C/EEPROM и цикъл на сън между движенията. Точността на продължителността на цикъла на сън намалява с увеличаване на продължителността, но достатъчна за тази цел

/*
* променено от кода
* от Матиас Лерой
*
* V0.2 ИЗМЕНЕНИЯ
** I2C SET GET
** EEPROM SET GET
** Премахване на сериен изход - засегнат I2C
** Активиране/деактивиране на проследяването
** ПРЕМЕСТЕТЕ УСЛУГИТЕ ДО ОГРАНИЧЕНИЯ ЧРЕЗ I2C
** ПРОЧЕТЕТЕ ТЕКУЩАТА СРЕДНА ИНТЕНЗИВНОСТ ЧРЕЗ I2C
* V0.3 ИЗМЕНЕНИЯ
** ПЕРЕКЛЮЧВАНЕ ЗА 2 РЕЖИМА - ТРАК (NO I2C) и КОНФИГУРИРАНЕ (ИЗПОЛЗВА I2C)
** СПАЙТЕ В РЕЖИМ НА ТРАКТА (МНОГО НИСКА ТОЧНОСТ ДО 8 ОТ ВТОРИ ЧАНКИ)
** ДЕТАЧ/ПРИКЛЮЧВАНЕ НА УСЛУГИ НА СЪН/СЪБУДЕНИЕ (ТРАНЗИСТОР, ИЗПОЛЗВАН СЛУЧАЙНО)
** ИЗТЕГЛЕТЕ КОНФИГУРИРУЕМОТО ПОЧАТНО ПОЛОЖЕНИЕ (НЕОБХОДИМО)
** ИЗТЕГЛЕТЕ КОНФИГУРИРУЕМИТЕ СЕКУНДИ НА СЪБЕЖДАНЕ (НЕОБХОДИМО)
** ИЗТЕГЛЕТЕ КОНФИГУРИРУЕМОТО АКТИВИРАНЕ/ИЗКЛЮЧВАНЕ (ЗАПОЛЗВАЩО)
** ИЗТЕГЛЯНЕ НА КОНФИГУРАЦИРАН ПРОСЛЕДИТЕЛ, АКТИВИРАН (ИЗПОЛЗВАЙТЕ ХАРАКТЕРИСТИЧЕН ПЕРЕКЛЮЧАТЕЛ)
** ОТСТРАНЯВАНЕ НА НАПРЕЖЕНИЕТО НА НАПРЕЖЕНИЕТО - ЩЕ ИЗПОЛЗВА ОТДЕЛЕН КОМПОНЕНТ I2C
** ДОБАВЕТЕ СЕРИЙНО ВХОД, КОГАТО НЕ ИЗПОЛЗВАТЕ I2C
*/
#включва
#включва
#включва
#включва
#включва
#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 // средно за всички 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
Servo _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 = невярно;
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 (receiveEvent);
Wire.onRequest (requestEvent);
} else {
Serial.println ("Режим на проследяване");
закъснение (5000); // време за отстраняване на ръцете, ако свържете батерията и т.н.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {
// ToDo: Включете транзисторния превключвател
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
за (int i = 0; i <20; i ++) {
ако (i! = 0) {
getLightValues ();
}
moveServos ();
}
забавяне (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: ИЗКЛЮЧВАЙТЕ ТРАНЗИСТОРНИЯ ПЕРЕКЛЮЧАТЕЛ
забавяне (500);
sleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- ТЕКУЩ РЕЖИМ
boolinConfigMode () {
pinMode (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
връщане _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
ако (
EEPROM.прочетено (IDX_SIGN_1)! = 'S' ||
EEPROM.прочетете (IDX_SIGN_2)! = 'T' ||
EEPROM.прочетено (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.прочетете (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
ако (брой == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
байтов индекс = Wire.read ();
байтова стойност = Wire.read ();
превключвател (cmd) {
случай'G ':
if (индекс <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [индекс];
}
прекъсване;
случай'S ':
if (индекс <IDX_END_EEPROM_SET) {
_i2cVals [индекс] = стойност;
EEPROM.update (индекс, _i2cVals [индекс]);
}
прекъсване;
по подразбиране:
връщане;
}
}
}
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] = карта (avgIntensity, 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);
for (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);
for (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 отива нагоре");
забавяне (_slowingDelay);
for (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 отива надолу");
забавяне (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
забавяне (_servoLoopDelay);
}
}
иначе {
Serial.println ("moveServos не прави нищо");
забавяне (_slowingDelay);
}
}
// --------------------------------- СПЪТ
voidasleepFor (unsignedint осемSecondSegments) {
Serial.println ("sleepFor");
за (неподписан sleepCounter = осемSecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

вижте rawtilt_pan_tracker_0.3.ino хоствано с ❤ от GitHub

Стъпка 4: Сглобяване на корпуса на веригата

Сглобяване на корпуса на веригата
Сглобяване на корпуса на веригата
Сглобяване на корпуса на веригата
Сглобяване на корпуса на веригата
Сглобяване на корпуса на веригата
Сглобяване на корпуса на веригата
  1. Уверете се, че Ardiuno Pro Mini е поставен в заглавките на печатната платка.
  2. Поставете основата на контролната кутия SOLAR TRACKER в стените на кутията на контролера SOLAR TRACKER и я поставете с 2 изключени самонарезни винта от неръждаема стомана 4G x 6 мм.
  3. Поставете Ardiuno Pro Mini + печатна платка с 6P заглавка за затваряне в празнотата в основата на контролера SOLAR TRACKER.
  4. Поставете капака на контролната кутия SOLAR TRACKER в стените на кутията на контролера на SOLAR TRACKER и я прикрепете с 2 изключени самонарезни винта от неръждаема стомана 4G x 6 мм.
  5. Прикрепете монтажа отгоре към основата на панелната рамка с 4 изключени самонарезни винта от неръждаема стомана 4G x 6 мм.

Стъпка 5: Свързване на проводниците на платформата към контролера

Свързване на проводниците на платформата към контролера
Свързване на проводниците на платформата към контролера
Свързване на проводниците на платформата към контролера
Свързване на проводниците на платформата към контролера
Свързване на проводниците на платформата към контролера
Свързване на проводниците на платформата към контролера

Уместните връзки, готови от предишния Instructable, са 4 изключени 2P LDR връзки и 2 изключени 3P връзки от сервомоторите. Това, което е временно, докато презареждането е готово, е батерията. Използвайте 3.7V LiPo, който засега завършва във 2P DuPont връзка.

  1. Поставете LDR връзките (без полярност) отгоре:

    1. Горе в дясно
    2. Горе вляво
    3. Долу вдясно
    4. Долу вляво
  2. Поставете серво връзките (със сигналния проводник вляво) отгоре:

    1. Хоризонтално
    2. Вертикален
  3. ПОЧАКАЙТЕ ДО ГОТОВО ЗА ТОГАВА ТОГАВА: Поставете 3.7V DC захранващия проводник +ve отгоре, -ve до долу.

Стъпка 6: Тестване на контролера

Image
Image

Както бе посочено по -горе, софтуерът не е оптимизиран за работния процес на Solar Charging. Тя може да бъде тествана и коригирана с помощта на естествени (слънчеви) и неестествени източници на светлина.

За да тествате проследяването в контролирана среда, може да е удобно да зададете SLEEP MINUTES на по -ниска стойност (вижте следващата стъпка).

Стъпка 7: Конфигуриране чрез I2C с помощта на конзолен вход

Това обяснява конфигурирането на контролера чрез втори MCU, въвеждане на настройки в прозореца на конзолата.

  1. Качете следния скрипт в D1M WIFI БЛОК (или Wemos D1 Mini).
  2. Изключете USB от компютъра
  3. ПИН ВРЪЗКИ: -ve (контролер) => GND (D1M)+ve (контролер) => 3V3 (D1M) SCL (контролер) => D1 (D1M)

    SDA (контролер) => D2 (D1M)

  4. Завъртете превключвателя SPDT на CONFIG
  5. Свържете USB към компютър
  6. От IDE на Arduino стартирайте конзолен прозорец с правилния COM порт
  7. Уверете се, че са избрани „Newline“и „9600 baud“
  8. Командите се въвеждат в полето за изпращане на текст, последвано от клавиша Enter
  9. Командите са във формат Характер байт байт
  10. Ако вторият байт (трети сегмент) не е включен, 0 (нула) се изпраща от скрипта
  11. Бъдете внимателни при използване на сериен вход; прегледайте въведеното от вас, преди да натиснете клавиша „Enter“. Ако сте блокирани (например промяна на I2C адреса на стойност, която сте забравили), ще трябва да мигате фърмуера на контролера отново.

Поддържаните варианти в първия знак на командата са:

  • E (Разрешаване на проследяване на серво) полезно за спиране на движението по време на конфигуриране. Това се въвежда чрез: E 0
  • D (Деактивиране на проследяването на серво) полезно за стартиране на автоматично проследяване, ако не рестартирате устройството. Това се въвежда чрез: D 0
  • G (Получаване на конфигурационна стойност) чете стойности от EEPROM и IN -MEMORY: Това се въвежда чрез: G (индексът е валидни байтови стойности 0 - 13 и 15)
  • S (Set EEPROM value) задава стойности на EEPROM, които са налични след рестартиране. Това се въвежда чрез: S (индексът е валидни байтови стойности 0 - 13, стойността е валидни байтови стойности и варират според свойствата)

Кодът е точката на истината за индексите, но следното се използва за ръководство за валидни стойности/коментари:

  • I2C ADDRESS 0 - подчинен адрес на контролера, капитанът се нуждае от това, за да комуникира с контролера (по подразбиране 10)
  • МИНИМАЛЕН ВЕРТИКАЛЕН ЪГЪЛ 1 - долна граница на вертикално серво серво (по подразбиране 10, диапазон 0 - 180)
  • МАКСИМАЛЕН ВЕРТИКАЛЕН ЪГЪЛ 2 - ъгъл вертикална серво горна граница (по подразбиране 170, диапазон 0 - 180)
  • ЧУВСТВИТЕЛНА ВЕРТИКАЛНА LDR 3 - Вертикална граница на четене на LDR (по подразбиране 20, диапазон 0 - 1024)
  • ВЕРТИКАЛЕН ЪГЪЛ СТЪПКА 4 - ъглови вертикални серво стъпки при всяка настройка (по подразбиране 5, диапазон 1 - 20)
  • МИНИМАЛЕН ХОРИЗОНТАЛЕН ЪГ 5 - долна граница на хоризонталното серво серво (по подразбиране 10, диапазон 0 - 180)
  • МАКСИМАЛЕН ХОРИЗОНТАЛЕН ЪГЛ 6 - ъгъл на хоризонтално серво горната граница (по подразбиране 170, диапазон 0 - 180)
  • ЧУВСТВИТЕЛНОСТ HORIZONTAL LDR 7 - Хоризонтално поле за четене на LDR (по подразбиране 20, диапазон 0 - 1024)
  • ХОРИЗОНТАЛЕН ЪГЪЛ СТЪПКА 8 - ъглови хоризонтални серво стъпки при всяка настройка (по подразбиране 5, диапазон 1 - 20)
  • SLEEP MINUTES 9 - приблизителният период на сън между проследяването (по подразбиране 20, диапазон 1 - 255)
  • ВЕРТИКАЛНА ЗОРА ЪГЪЛ 10 - БЪДЕЩА ИЗПОЛЗВАНЕ - вертикалният ъгъл, към който да се върнете, когато слънцето залезе
  • ХОРИЗОНТАЛНА ЗОРА ЪГЛ 11 - БЪДЕЩА ИЗПОЛЗВАНЕ - хоризонталният ъгъл, към който да се върнете, когато слънцето залезе
  • DAWN INTENSITY 12 - БЪДЕЩА ИЗПОЛЗВАНЕ - минималната средна стойност от всички LDR, която задейства началото на ежедневното проследяване на слънцето
  • DUSK INTENSITY 13 - БЪДЕЩА ИЗПОЛЗВАНЕ - минималната средна стойност от всички LDR, която задейства края на ежедневното проследяване на слънцето
  • КРАЙ НА МАРКЕРА ЗА ЗНАЧЕНИЯ НА EEPROM 14 - НЕ СЕ ИЗПОЛЗВА СТОЙНОСТ
  • ТЕКУЩА ИНТЕНСИВНОСТ 15 - текущият среден процент от интензитета на светлината
  • КРАЙ НА ПОМЕЩЕНИТЕ ЗНАЧЕНИЯ МАРКЕР 16 - НЕ ИЗПОЛЗВАНА СТОЙНОСТ.

Захваща сериен вход (клавиатурен вход в прозореца на конзолата) и го препраща към I2C подчинен във формат char, байт, байт

#включва
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
логическо _newData = невярно;
const байт _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;
}
} else {
_receivedChars [ndx] = '\ 0'; // прекратяваме низа
ndx = 0;
_newData = вярно;
}
}
}
voidparseSendCommands () {
if (_newData == true) {
constchar delim [2] = "";
char *жетон;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
байтов индекс = 0;
байтова стойност = 0;
int i = 0;
while (знак! = NULL) {
//Serial.println(token);
i ++;
превключвател (i) {
случай 1:
token = strtok (NULL, delim);
индекс = atoi (жетон);
прекъсване;
случай 2:
token = strtok (NULL, delim);
if (жетон! = NULL) {
стойност = atoi (знак);
}
прекъсване;
по подразбиране:
жетон = NULL;
}
}
sendCmd (cmd, индекс, стойност);
_newData = false;
}
}
voidsendCmd (char cmd, байтов индекс, байтова стойност) {
Serial.println ("-----");
Serial.println ("Изпращане на команда:");
Serial.println ("\ t" + String (cmd) + "" + String (индекс) + "" + Низ (стойност));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // предава на устройството
Wire.write (cmd); // изпраща char
Wire.write (индекс); // изпраща един байт
Wire.write (стойност); // изпраща един байт
Wire.endTransmission ();
байтов отговор = 0;
bool hadResponse = false;
if (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // slave може да изпрати по -малко от заявеното
{
hadResponse = вярно;
отговор = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Получаване на отговор:");
Serial.println (отговор);
} else {
Serial.println ("Няма отговор, проверете адреса/връзката");
}
}
}

вижте rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino хоствано с ❤ от GitHub

Стъпка 8: Следващи стъпки

Периодично проверявайте за промени в софтуера/хардуера.

Променете софтуера/хардуера според вашите изисквания.

Коментирайте всякакви заявки/оптимизации.

Препоръчано: