Pull to refresh
293
0
Артем Кашканов @radiolok

Релейно-декатронный маньяк

Send message
Как помешанный на реле рад видеть продолжение работы над такой красотой. Сам потихоньку (уже 6-й год) проектирую РЦВМ-2 на герконовых реле. Пока только 1200 из 3000 реле набрал — у вас не найдется пары сотен ненужных РЭС55 и РЭС64?
Интересные релюшки со светодиодами…

Вопрос по шине адреса — память программ и адреса раздельно или вместе? Не маловато ли будет 256 ячеек под программу? Понятно что большая часть тестовых программок не превзойдет и сотни байт, но если душа захочет больше?
Можно 2 или 4 регистра допаять до возможности соединяться в 16-разрядный регистр адреса для ОЗУ к примеру. Хотя придется что-то изменять в конструкции.

И что насчет SRAM? тоже реле, или как у всех остальных проектов микросхема?
Вопрос на засыпку — возможно ли подключить к Intel Edison камеру RealSense и разработать соответствующий Автономный софт для нее?
Можно пойти еще дальше — поставить многооборотный, проволочный высокоточный резистор с нулевым ТКС за 100500 денег, но зачем?

Если вы ставите подстроечный резистор, то предполагается, что вам он потом понадобится. Зачем он нужен для усилителя? Регулировать напряжение смещения на транзисторе и глубину ООС на слух? Один раз по приборам отрегулировал, зафиксировал и хватит.

В измерительных приборах другое дело — там требуется возможность регулировки при поверках для соответствия заявленным характеристикам. Причем задача именно переменного резистора — на все свои 270 градусов обеспечить подстройку чего-либо в диапазоне 5-10%, для остального у него по обеим сторонам как правило ставятся постоянные резисторы. т.е. при своей точности в 5-10%, и ненормируемом ТКС, плавать от всех бяк выставленный параметр будет на доли процента, что будет соответствовать точности прибора.
Обоснуйте пожалуйста, для чего необходимы шунтирующие конденсаторы для диодов выпрямительного моста, в случае, если используются обычные диоды, а не диоды шотки?
Переменные резисторы плывут. Причем от всего: от температуры, от вибрации, от влажности! У вас есть контакт, который имеет большую площадь, но точка касания — всего одна и мизерная. Малейшая вибрация — и точка касания может переместиться.

Есть задачи, в которых использование подстроечных резисторов оправдано — когда вся остальная схема плывет еще сильнее. например, в терменвоксе есть подстроечный резистор для настройки мензуры инструмента — нужно каждый раз постраивать под себя, так как человек является частью колебательного контура.

Но в устройстве, где стабильность зависит от самого резистора — подстроечник помогает только на начальном этапе.
В важных системах задача решается концевиками, которые самостоятельно отключают привод при достижении определенного положения даже в том случае, если откажет система управления.

В оказавшейся под боком релюшке реализовано именно такое решение — не смотря на подаваемый в 0,5 секунды управляющий импульс, отключается от него она самостоятельно.
Показанное здесь демо сделано по принципу «слепила из того что было» и призвано показать часть возможностей плат Energia lauchpad.

Так что я и не ставил задачу собрать что-то грандиозное.
Но я хотел рассказать и о беспроводных решениях субгигагерцового диапазона, поэтому взял первый попавшийся ланчпад на msp430 и прикрепил к нему радиомодуль. Получился брелок, который в продакшене будет очень хорошо смотреться с камнем CC430 — это МК со встроенным радиомодулем.

Самая уязвимая часть таких устройств — питание актуатора. Отключили питание — ломай дверь. С другой стороны — если заклинит обычный замок — ломай дверь. Причем электропитание — более надежная штука чем механизм. Опять же, отключенное питание не вызовет срабатывания замка в ту или иную сторону, если это простой электромагнит.
Вот гляжу я на изображения и вижу на каждой с десяток различных предметов. И это меня наводит на мысли, что нельзя так просто взять 100500 изображений, потрясти их вместе и получить хоть какой-либо результат.

У проблема со стереозрением. Я вижу объем только когда картинка перед глазами движется.

И знаете что? В исходных данных для этих нейросетей очень не хватает канала объема (как в RealSence), чтобы нейронная сеть смогла на основании естественных координат определять где находится предмет, а где фон. Существующая технология фокусировки изображения на том или ином предмете им в этом поможет.
А дальше можно и форму предмета определить, шар, куб и прочее.

UPD: Вот тут http://habrahabr.ru/post/249661/ эта мысль хорошо описана.

И не гадать где тут контур бетономешалки.

Кстати сие весьма успешно применяется в робомобилях с их лазерными дальномерами.
Во-первых, хорошей привычкой будет использовать присваивание значений регистру при первом использовании в среде программирования, в которой не можешь быть уверен, не накидала ли среда еще чего. 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кГц.
ISR(ADC_vect)
ISR(ADC_vect){
  if( ( UCSR0A & (1<<UDRE0)) ){
    UDR0 = ADCH;//copy result. 
  }
}


Лайвхак — микроконтроллер все остальное время может заниматься чем угодно. Главное не использовать встроенные ардуино-функции, которые используют указанные модули.
Сейчас вы уперлись в скорость 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.


Видеоурок по изготовлению такого жука-киборга в домашних условиях.
Слева -4, справа +1
Светлая тема
На низковольтной линии сечение выбирается исходя не только из номинального тока, и нагрева, а еще из максимальных потерь напряжения в кабеле(например, не более 10%), устанавливаемых либо ПУЭ, либо внутренними требованиями возводимого объекта.
Если у вас 12В ветка метров 100, то меньше 10мм^2 на 12В там положить, вероятно, не получится.
Ну и да, поправка — где такое надо, кабель в итоговой смете — 1-2%.

Для бытового провода в 20метров, 2.5кв мм, да передаваемых по нему 10Вт потери не страшны, согласен.

Компромиссом являются телекоммуникационные 48В.
По дороге можно смело потерять 2-3В, да и для преобразователей еще возможно использовать низковольтные феты, с сопротивлением канала единицы и десятки мОм, а размеры моточных элементов достаточно малы — имеем малый размер преобразователя и высокий КПД.
Аккумуляторов и панелей надо всего 4 штуки, чтобы получить это напряжение.

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Works in
Registered
Activity