Как помешанный на реле рад видеть продолжение работы над такой красотой. Сам потихоньку (уже 6-й год) проектирую РЦВМ-2 на герконовых реле. Пока только 1200 из 3000 реле набрал — у вас не найдется пары сотен ненужных РЭС55 и РЭС64?
Интересные релюшки со светодиодами…
Вопрос по шине адреса — память программ и адреса раздельно или вместе? Не маловато ли будет 256 ячеек под программу? Понятно что большая часть тестовых программок не превзойдет и сотни байт, но если душа захочет больше?
Можно 2 или 4 регистра допаять до возможности соединяться в 16-разрядный регистр адреса для ОЗУ к примеру. Хотя придется что-то изменять в конструкции.
И что насчет SRAM? тоже реле, или как у всех остальных проектов микросхема?
Можно пойти еще дальше — поставить многооборотный, проволочный высокоточный резистор с нулевым ТКС за 100500 денег, но зачем?
Если вы ставите подстроечный резистор, то предполагается, что вам он потом понадобится. Зачем он нужен для усилителя? Регулировать напряжение смещения на транзисторе и глубину ООС на слух? Один раз по приборам отрегулировал, зафиксировал и хватит.
В измерительных приборах другое дело — там требуется возможность регулировки при поверках для соответствия заявленным характеристикам. Причем задача именно переменного резистора — на все свои 270 градусов обеспечить подстройку чего-либо в диапазоне 5-10%, для остального у него по обеим сторонам как правило ставятся постоянные резисторы. т.е. при своей точности в 5-10%, и ненормируемом ТКС, плавать от всех бяк выставленный параметр будет на доли процента, что будет соответствовать точности прибора.
Обоснуйте пожалуйста, для чего необходимы шунтирующие конденсаторы для диодов выпрямительного моста, в случае, если используются обычные диоды, а не диоды шотки?
Переменные резисторы плывут. Причем от всего: от температуры, от вибрации, от влажности! У вас есть контакт, который имеет большую площадь, но точка касания — всего одна и мизерная. Малейшая вибрация — и точка касания может переместиться.
Есть задачи, в которых использование подстроечных резисторов оправдано — когда вся остальная схема плывет еще сильнее. например, в терменвоксе есть подстроечный резистор для настройки мензуры инструмента — нужно каждый раз постраивать под себя, так как человек является частью колебательного контура.
Но в устройстве, где стабильность зависит от самого резистора — подстроечник помогает только на начальном этапе.
В важных системах задача решается концевиками, которые самостоятельно отключают привод при достижении определенного положения даже в том случае, если откажет система управления.
В оказавшейся под боком релюшке реализовано именно такое решение — не смотря на подаваемый в 0,5 секунды управляющий импульс, отключается от него она самостоятельно.
Показанное здесь демо сделано по принципу «слепила из того что было» и призвано показать часть возможностей плат Energia lauchpad.
Так что я и не ставил задачу собрать что-то грандиозное.
Но я хотел рассказать и о беспроводных решениях субгигагерцового диапазона, поэтому взял первый попавшийся ланчпад на msp430 и прикрепил к нему радиомодуль. Получился брелок, который в продакшене будет очень хорошо смотреться с камнем CC430 — это МК со встроенным радиомодулем.
Самая уязвимая часть таких устройств — питание актуатора. Отключили питание — ломай дверь. С другой стороны — если заклинит обычный замок — ломай дверь. Причем электропитание — более надежная штука чем механизм. Опять же, отключенное питание не вызовет срабатывания замка в ту или иную сторону, если это простой электромагнит.
Вот гляжу я на изображения и вижу на каждой с десяток различных предметов. И это меня наводит на мысли, что нельзя так просто взять 100500 изображений, потрясти их вместе и получить хоть какой-либо результат.
У проблема со стереозрением. Я вижу объем только когда картинка перед глазами движется.
И знаете что? В исходных данных для этих нейросетей очень не хватает канала объема (как в RealSence), чтобы нейронная сеть смогла на основании естественных координат определять где находится предмет, а где фон. Существующая технология фокусировки изображения на том или ином предмете им в этом поможет.
А дальше можно и форму предмета определить, шар, куб и прочее.
Во-первых, хорошей привычкой будет использовать присваивание значений регистру при первом использовании в среде программирования, в которой не можешь быть уверен, не накидала ли среда еще чего. Arduino вполне себе может.
Как раз вот это:
На результат не влияют: установка частоты преобразования 76 КГц и выше битами ADPS0… ADPS2
Должно было вас насторожить.
Во-вторых, вы забыли переключить АЦП в 8-битный режим. В 10-битном режиме максимум — 15килосемплов.
Вот ваш скетч, но выдающий в бенчмарке 65килосемплов. Не 76, но у нас слишком много накладных расходов по дороге
Скетч
void setup() {
Serial.begin (57600); // 9600, 19200, 38400, 57600 and 115200 bit/s
ADCSRA = (1 << ADEN) // Включаем АЦП
|(1 << ADPS2); // устанавливаем предделитель преобразователя на 8
ADMUX = (1<< ADLAR) | (1 << REFS0) //выставляем опорное напряжение, как внешний ИОН
|(0 << MUX0); // снимать сигнал будем с входа PC0
}
int u=0;
void loop(){
unsigned long time_start = millis();
for (int i = 0; i < 1024; i++) {
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA & (1 << ADIF)) == 0);// пока не будет выставлено флага об окончании преобразования
u = ADCH; // Считываем полученное значение
// adc_bytes[i] = ADCL; // Считываем полученное значение
}
unsigned long time_end = millis();
unsigned int dt = time_end - time_start;
unsigned int f = 1000000000/1024/dt;
Serial.print (f);
Serial.println("Hz");
}
В-третьих, выше я написал корректный код для Atmega1280 (Читать Arduino Mega). Переделывать под ATmega328 мне лень — откройте датащит и проверьте имена регистров. Таки могут отличаться. А еще преобразователь uart-usb у Uno может не тянуть скорость в 1мбод. Он там на Atmega8u2 реализован, и ХЗ что там в программе написано. Не смотрел.
Мой скетч целиком
бенчмарков не делал
void setup()
{
autoadcsetup();
}
void loop()
{
}
int i = 255;
void autoadcsetup(){
//set up TIMER0 to 62.5kHz
//TIMER0_OVF will be the trigger for ADC
/*normal mode, no prescaler
16MHz / 256 = 62.5 kHz*/
TCCR0B = (1 << CS00);//timer frequency = clk/1
//set ADC.
ADMUX = (1 << ADLAR) | (1 << MUX0) | (1 << REFS0);//8-bit mode, ADC0 channel, AVVCC as ref
ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2);//TUrn ADC On, trigger enable, Interrupt enable, sysclk/16=1MHz_ADC_clk=76kHz conv freq(13ticks per conversion)
ADCSRB = (1<< ADTS2) ;//Auto trigger source
//set UART to 8-n-1 1Mbod:
UBRR0H = 0;//1Mbod (use Examples of Baud Rate Setting table from datasheet)
UBRR0L = 1;//1Mbod
UCSR0B = (1<<TXEN0);//enable Transmitter
UCSR0C = (3<<UCSZ00);//8-bit mode
}
ISR(ADC_vect){
if( ( UCSR0A & (1<<UDRE0)) ){
UDR0 = ADCH;//copy result.
}
}
В четвертых, если вы читаете ADCL — обязательно требуется прочитать ADCH — пока не прочтете старший, данные заблокированы. т.е.е либо младший-старший, либо только старший, но никак не наоборот.
В пятых. Просто напоминаю
57600бод/10 (8-n-1 — старт-8 бит данных-стоп) = 5,76 кГц На передачу.
В отличие от ks010, nt7534 и многих других, вашим драйвером очень просто управлять. Не надо реализовывать никакие команды настройки, достаточно просто загружать в сдвиговый регистр данные. В этом, правда, кроется его недостаток — драйвер тупой. Все нужно делать за него.
Судя по датащиту, подключение возможно организовать по SPI, загружая 160-бит данных в сдвиговый регистр на один контроллер (каждый дает 80х2 точек, контроллеры стекируются).
Единственное что нужно знать для конкретного дисплея — сколько контроллеров на нем и в какой последовательности пронумерованы пикселы.
Изображение будет удобно хранить в формате XBM — оно будет сразу готово к загрузке.
Набросал и проверил на ATmega1280. беглый взгляд по регистрам ATmega168(328) говорит что для него ничего править не надо.
В setup добавляем вызов функции, которая нам все настроит.
Путем подстановки нужных значений в регистре UBRR достигается необходимый битрейт. Можно взять из таблицы, можно оформить макросом.
У меня выбран канал АЦП1, можно поставить свой согласно таблице датащита.
void autoadcsetup()
void autoadcsetup(){
//set up TIMER0 to 62.5kHz
//TIMER0_OVF will be the trigger for ADC
/*normal mode, no prescaler
16MHz / 256 = 62.5 kHz*/
TCCR0B = (1 << CS00);//timer frequency = clk/1
//set ADC.
ADMUX = (1 << ADLAR) | (1 << REFS0) | (1 << MUX0);//8-bit mode, ADC0 channel, AVVCC as ref
ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2);//TUrn ADC On, trigger enable, Interrupt enable, sysclk/16=1MHz_ADC_clk=76kHz conv freq(13ticks per conversion)
ADCSRB = (1<< ADTS2) ;//Auto trigger source
//set UART to 8-n-1 1Mbod:
UBRR0H = 0;//1Mbod (use Examples of Baud Rate Setting table from datasheet)
UBRR0L = 0;//1Mbod
UCSR0B = (1<<TXEN0);//enable Transmitter
UCSR0C = (3<<UCSZ00);//8-bit mode
}
И добавляем вектор прерывания АЦП, в которым можно засунуть рутину по добавлению заголовка. у меня просто проверка того, что прошлая передача была завершена и помещение 8 бит в регистр передачи.
Таким образом скорость ограничена либо частотой преобразования АЦП, либо частотой передачи UART.
Автотриггер для АЦП настроен на 62.5кГц, но, добавив обработчик TIMER0_OVF_vect и в нем устанавливать стартовый TCNT0, можно поднять до максимальных 76кГц.
Лайвхак — микроконтроллер все остальное время может заниматься чем угодно. Главное не использовать встроенные ардуино-функции, которые используют указанные модули.
Сейчас вы уперлись в скорость UART и линейную программу — МК ждет у моря погоды попеременно установку флага АЦП и флага TX empty
Переписав все на прерываниях и используя среду ардуино только для заливки кода можно приблизиться с датащитовым 76кГц.
Для этого надо настроить таймер для синхронного запуска АЦП, настроить АЦП на trigger_режим, в прерывании АЦП класть в TX buf UART-а, настроенного на 1мбод(не в курсе, переварит ли usb-uart мост в uno такую скорость, платы с преобразователем на FT232RL справляются). Ну и немного рутины, чтобы сделать заголовок вашему пакету в 2048 байт.
в регистре ADMUX необходимо выставить бит ADLAR в единицу.
В этом случае в регистре ADCH будут размещаться биты ADC9-ADC2. Считывать необходимо только его.
Для этого в ардуино необходимо править файл wiring_analog.c, создав, например, копию функции analogRead() с модифицированными строками и именем типа analogRead8bit():
///
ADMUX = (analog_reference << 6) | (pin & 0x07) | (1<< ADLAR);//устанавливаем соответствующий бит
///
return high; //все что связано с low можно удалить. Главное прочитать ADCH.
На низковольтной линии сечение выбирается исходя не только из номинального тока, и нагрева, а еще из максимальных потерь напряжения в кабеле(например, не более 10%), устанавливаемых либо ПУЭ, либо внутренними требованиями возводимого объекта.
Если у вас 12В ветка метров 100, то меньше 10мм^2 на 12В там положить, вероятно, не получится.
Ну и да, поправка — где такое надо, кабель в итоговой смете — 1-2%.
Для бытового провода в 20метров, 2.5кв мм, да передаваемых по нему 10Вт потери не страшны, согласен.
Компромиссом являются телекоммуникационные 48В.
По дороге можно смело потерять 2-3В, да и для преобразователей еще возможно использовать низковольтные феты, с сопротивлением канала единицы и десятки мОм, а размеры моточных элементов достаточно малы — имеем малый размер преобразователя и высокий КПД.
Аккумуляторов и панелей надо всего 4 штуки, чтобы получить это напряжение.
Интересные релюшки со светодиодами…
Вопрос по шине адреса — память программ и адреса раздельно или вместе? Не маловато ли будет 256 ячеек под программу? Понятно что большая часть тестовых программок не превзойдет и сотни байт, но если душа захочет больше?
Можно 2 или 4 регистра допаять до возможности соединяться в 16-разрядный регистр адреса для ОЗУ к примеру. Хотя придется что-то изменять в конструкции.
И что насчет SRAM? тоже реле, или как у всех остальных проектов микросхема?
Если вы ставите подстроечный резистор, то предполагается, что вам он потом понадобится. Зачем он нужен для усилителя? Регулировать напряжение смещения на транзисторе и глубину ООС на слух? Один раз по приборам отрегулировал, зафиксировал и хватит.
В измерительных приборах другое дело — там требуется возможность регулировки при поверках для соответствия заявленным характеристикам. Причем задача именно переменного резистора — на все свои 270 градусов обеспечить подстройку чего-либо в диапазоне 5-10%, для остального у него по обеим сторонам как правило ставятся постоянные резисторы. т.е. при своей точности в 5-10%, и ненормируемом ТКС, плавать от всех бяк выставленный параметр будет на доли процента, что будет соответствовать точности прибора.
Есть задачи, в которых использование подстроечных резисторов оправдано — когда вся остальная схема плывет еще сильнее. например, в терменвоксе есть подстроечный резистор для настройки мензуры инструмента — нужно каждый раз постраивать под себя, так как человек является частью колебательного контура.
Но в устройстве, где стабильность зависит от самого резистора — подстроечник помогает только на начальном этапе.
В оказавшейся под боком релюшке реализовано именно такое решение — не смотря на подаваемый в 0,5 секунды управляющий импульс, отключается от него она самостоятельно.
Так что я и не ставил задачу собрать что-то грандиозное.
Но я хотел рассказать и о беспроводных решениях субгигагерцового диапазона, поэтому взял первый попавшийся ланчпад на msp430 и прикрепил к нему радиомодуль. Получился брелок, который в продакшене будет очень хорошо смотреться с камнем CC430 — это МК со встроенным радиомодулем.
Самая уязвимая часть таких устройств — питание актуатора. Отключили питание — ломай дверь. С другой стороны — если заклинит обычный замок — ломай дверь. Причем электропитание — более надежная штука чем механизм. Опять же, отключенное питание не вызовет срабатывания замка в ту или иную сторону, если это простой электромагнит.
У проблема со стереозрением. Я вижу объем только когда картинка перед глазами движется.
И знаете что? В исходных данных для этих нейросетей очень не хватает канала объема (как в RealSence), чтобы нейронная сеть смогла на основании естественных координат определять где находится предмет, а где фон. Существующая технология фокусировки изображения на том или ином предмете им в этом поможет.
А дальше можно и форму предмета определить, шар, куб и прочее.
UPD: Вот тут http://habrahabr.ru/post/249661/ эта мысль хорошо описана.
И не гадать где тут контур бетономешалки.
Кстати сие весьма успешно применяется в робомобилях с их лазерными дальномерами.
Как раз вот это:
Должно было вас насторожить.
Во-вторых, вы забыли переключить АЦП в 8-битный режим. В 10-битном режиме максимум — 15килосемплов.
Вот ваш скетч, но выдающий в бенчмарке 65килосемплов. Не 76, но у нас слишком много накладных расходов по дороге
В-третьих, выше я написал корректный код для Atmega1280 (Читать Arduino Mega). Переделывать под ATmega328 мне лень — откройте датащит и проверьте имена регистров. Таки могут отличаться. А еще преобразователь uart-usb у Uno может не тянуть скорость в 1мбод. Он там на Atmega8u2 реализован, и ХЗ что там в программе написано. Не смотрел.
В четвертых, если вы читаете ADCL — обязательно требуется прочитать ADCH — пока не прочтете старший, данные заблокированы. т.е.е либо младший-старший, либо только старший, но никак не наоборот.
В пятых. Просто напоминаю
57600бод/10 (8-n-1 — старт-8 бит данных-стоп) = 5,76 кГц На передачу.
Единственное что нужно знать для конкретного дисплея — сколько контроллеров на нем и в какой последовательности пронумерованы пикселы.
Изображение будет удобно хранить в формате XBM — оно будет сразу готово к загрузке.
В setup добавляем вызов функции, которая нам все настроит.
Путем подстановки нужных значений в регистре UBRR достигается необходимый битрейт. Можно взять из таблицы, можно оформить макросом.
У меня выбран канал АЦП1, можно поставить свой согласно таблице датащита.
И добавляем вектор прерывания АЦП, в которым можно засунуть рутину по добавлению заголовка. у меня просто проверка того, что прошлая передача была завершена и помещение 8 бит в регистр передачи.
Таким образом скорость ограничена либо частотой преобразования АЦП, либо частотой передачи UART.
Автотриггер для АЦП настроен на 62.5кГц, но, добавив обработчик TIMER0_OVF_vect и в нем устанавливать стартовый TCNT0, можно поднять до максимальных 76кГц.
Лайвхак — микроконтроллер все остальное время может заниматься чем угодно. Главное не использовать встроенные ардуино-функции, которые используют указанные модули.
у моря погодыпопеременно установку флага АЦП и флага TX emptyПереписав все на прерываниях и используя среду ардуино только для заливки кода можно приблизиться с датащитовым 76кГц.
Для этого надо настроить таймер для синхронного запуска АЦП, настроить АЦП на trigger_режим, в прерывании АЦП класть в TX buf UART-а, настроенного на 1мбод(не в курсе, переварит ли usb-uart мост в uno такую скорость, платы с преобразователем на FT232RL справляются). Ну и немного рутины, чтобы сделать заголовок вашему пакету в 2048 байт.
В этом случае в регистре ADCH будут размещаться биты ADC9-ADC2. Считывать необходимо только его.
Для этого в ардуино необходимо править файл wiring_analog.c, создав, например, копию функции analogRead() с модифицированными строками и именем типа analogRead8bit():
///
ADMUX = (analog_reference << 6) | (pin & 0x07) | (1<< ADLAR);//устанавливаем соответствующий бит
///
return high; //все что связано с low можно удалить. Главное прочитать ADCH.
Видеоурок по изготовлению такого жука-киборга в домашних условиях.
Светлая тема
Если у вас 12В ветка метров 100, то меньше 10мм^2 на 12В там положить, вероятно, не получится.
Ну и да, поправка — где такое надо, кабель в итоговой смете — 1-2%.
Для бытового провода в 20метров, 2.5кв мм, да передаваемых по нему 10Вт потери не страшны, согласен.
Компромиссом являются телекоммуникационные 48В.
По дороге можно смело потерять 2-3В, да и для преобразователей еще возможно использовать низковольтные феты, с сопротивлением канала единицы и десятки мОм, а размеры моточных элементов достаточно малы — имеем малый размер преобразователя и высокий КПД.
Аккумуляторов и панелей надо всего 4 штуки, чтобы получить это напряжение.