RSS блога
Подписка
TinyRF - радиоуправление и обмен данными на ATttiny13
При разработке различных DIY устройств нередко возникает потребность в передаче/получении каких-либо данных по воздуху. Если в случае использования «взрослых» микроконтроллеров (ATmega, STM) эта задача решается за пару минут подключением сторонней библиотеки, то с младшими версиями не все так просто. Наиболее популярные библиотеки зачастую не влезают в них, а существующие адаптации имеют сильно урезанный функционал. Продолжая тему выжимания нетипичных возможностей из дешевых и примитивных микроконтроллеров ATtiny13, я специально для них написал простую и компактную библиотеку, которая реализует один из наиболее популярных протоколов радиообмена и позволяет не только передавать/принимать данные, но и управлять некоторыми сторонними устройствами. Возможно эта тема окажется многим полезной, поэтому я хочу поделиться исходниками и показать некоторые примеры ее использования.
Приемник читает значение очередного бита с линии данных только в момент получения тактового импульса, который генерируется передатчиком примерно в середине каждого бита, таким образом отпадает проблема синхронизации между передатчиком и приемником.
Но как быть, если провод для передачи данных один единственный? Для этого придумали различные методы кодирования сигнала, наиболее известным из которых является манчестерское кодирование:
Манчестерский код довольно прост в понимании и реализации: в нем нулевые и единичные биты исходных данных кодируются направлением изменения сигнала (0-1 или 1-0) в середине каждого бита. Тем не менее есть еще более простые способы передачи данных, особенно если не столь важна скорость.
Единичный бит кодируется последовательностью {3; 1}, т.е. сначала в течение 3-х некоторых отсчетов времени предается высокий уровень, а затем 1 отсчет времени — низкий. Нулевой бит имеет обратные значения {1; 3} — 1 высокий импульс и 3 низких. Длина единичного отсчета времени (импульса) у EV1527 составляет 350 микросекунд. Кроме того, перед данными передается особая преамбула, имеющая формулу {1; 31}:
Она позволяет приемнику отследить начало передачи данных и начать их принимать. В зависимости от реализации преамбула может передаваться как в начале, так и в конце посылки. Это не играет большой разницы, так как в целях повышения надежности посылки с сообщениями отправляются многократно (10 и более раз подряд). Кодированная данным протоколом единичная посылка из 8 бит двоичного числа 10101010 выглядит как-то так:
В стандартном исполнении посылки EV1527 имеют длину 3 байта (24 бит), но что мешает нам в личных целях использовать любой размер передаваемых данных? В идеальных условиях — ничто не мешает, но в реальности слишком длинные сообщения данным методом передавать не выйдет из-за помех и отсутствия какого-либо устранения ошибок. Тем не менее, для отправки коротких посылок с данными на 2-4 байта этот протокол подходит отлично, к тому же он поддерживается сторонними библиотеками для Arduino (например, RCSwitch) поэтому я решил реализовать именно его. Существует множество разновидностей таких протоколов, есть даже трехуровневые (tri-state) вариации, где бит помимо стандартных «0» и «1» может принимать третье значение «F» и называется трит, но я реализовал только самый простой вариант — двоичный.
Процесс отправки и приема сообщений завязан на аппаратном таймере (у ATtiny13 он один единственный), вычисление настроек таймера выполняется на этапе компиляции с учетом тактовой частоты микроконтроллера, поэтому в проекте обязательно должна быть объявлена директива F_CPU с указанием тактовой частоты в герцах (например, 1.2 МГц = 1200000 Гц). В целом поддерживаются все основные частоты (0.6, 1.2, 4.8, 9.6 МГц), на других совместимых микроконтроллерах с другими частотами (например, 16.5 МГц на ATtiny85) тоже нет никаких проблем.
Таймер (а точнее тактовый генератор) у ATtiny может быть очень кривым, поэтому при каких-либо проблемах с приемом/передачей в первую очередь необходимо попробовать подкрутить F_CPU, а в идеале — откалибровать генератор. С этим я столкнулся, когда проверял правильность отсчета времени таймером. Так по мнению ATtiny13, работающего на частоте 4.8МГц, выглядит меандр с шириной импульса 350 микросекунд:
Поначалу я грешил на вычислительные затраты, но при понижении до частоты 1.2 МГц ситуация наоборот улучшилась:
Разгадка оказалась проста — у многих версий ATtiny13 внутри стоят 2 разных тактовых генератора: на 9.6 МГц и 4.8 МГц, причем первый более-менее откалиброван с завода, а второй — как получится. Частоты 1.2 МГц и 0.6 МГц соответственно получаются с помощью деления на 8, поэтому погрешности сохраняются. Тем не менее, как показали эксперименты, разница в 50мкс оказалась несущественной, поэтому прием/передача практически всегда работают нормально без лишних калибровок и настроек.
Обобщенный пример передачи сообщений:
Обобщенный пример приема сообщений:
Как видно, некоторые параметры можно конфигурировать с помощью директив, можно даже частично перенастроить сам протокол. Полный список доступных директив можно найти здесь
Схема приемника:
Для тестов я собрал его из подручных материалов на обрезке макетки:
Для увеличения дальности следует припаять к приемнику обрезок провода длиной 17.3 см. Скомпилированный с оптимизацией по размеру пример приемника занимает 636 байт (62% памяти микроконтроллера), причем довольно много весит сама логика проверки сообщений. Тем не менее, еще остается достаточно места на добавление каких-либо действий.
Схема передатчика:
В качестве антенны — такой же кусок провода:
Пример работы:
Передатчик весит заметно скромнее — всего 286 байт (28%), что дает пространство для маневра и добавления целой кучи своей логики. Дальность уверенной связи — около 20 метров по прямой или в пределах одной комнаты, в первую очередь из-за шумности приемника. Кроме того, как выяснилось, приемник работает нормально только в узком диапазоне напряжений питания (4-5В), в остальных случаях безбожно шумит и не может обеспечить нормальный сигнал на выходе даже при передаче «в упор».
Библиотека совместима с некоторыми другими микроконтроллерами из серии ATtiny, один из них — ATtiny85, который известен тем, что используется в Arduino-совместимой плате Digispark. Это сильно упрощает эксперименты, потому что его можно прошить через обычный USB порт из Arduino IDE без всяких программаторов. Я портировал пример мигания светодиодами в скетч для заливки в Digispark с той лишь разницей, что вместо управления 4-мя внешними диодами в нем переключается только 1 светодиод, встроенный в Digispark (висит на пине PB1). Важно отметить, что в скетчах не нужно указывать частоту в F_CPU, потому что Arduino IDE подставляет ее сама при компиляции.
Схема приемника и передатчика:
Пример работы:
В приведенном примере представлен простой и немного избыточный, но действенный способ проверки целостности коротких сообщений. Фактически размер команды — 1 байт, вторым байтом в сообщении отправляется инвертированное значение первого:
Приемник предварительно проверяет корректность полученной команды, пытаясь сравнить на равенство:
В случае ошибок при приеме равенство не выполняется, и команда игнорируется. Такой способ проверки достаточно надежен, я поэкспериментировал и не заметил ложных срабатываний в течение нескольких дней непрерывной работы, но в реальных ответственных сценариях использования стоит усилить защиту дополнительными проверками.
Скомпилированный код весит всего 576 байт (56% памяти ATtiny13), что даже меньше, чем в примере управления светодиодами. Как вы догадываетесь, с помощью этого репитера можно увеличить дальность работы предыдущего примера, если разместить его между приемником и передатчиком (предварительно уменьшив время задержки до 250-500 мс).
Версия для Digispark:
Чтобы сделать пример более осязаемым предлагаю на примере скетча для Digispark немного видоизменить код повторителя, сделав из него «инвертор»: при получении команды на включение светодиода (11, 22, 33, 44) он будет с задержкой 250 мс передавать в эфир обратную ей команду на выключение (55, 66, 77, 88):
И если раньше переключение светодиодов происходило так:
То со включенным находящимся рядом «инвертирующим повторителем» оно происходит так:
Т.е. повторитель принимает «включающие» команды одновременно с основным приемником и с небольшой задержкой перебивает их своими «выключающими».
Поэтому с помощью ATtiny при желании можно добавить радиоуправление в другие существующие устройства — на что хватит фантазии.
Вселенная на проводе
Как передать цифровой сигнал, состоящий из нулей и единиц, из точки A в точку B? Кажущаяся тривиальной задача на самом деле не является таковой, даже в случае передачи данных по физическому проводу. Если мы просто подадим обычный («сырой») цифровой сигнал на линию связи, то приемник на другом конце не сможет различать между собой отдельные биты в длинных последовательностях нулей и единиц. В проводных линиях связи самый простой способ решения проблемы — передача тактирующего сигнала по отдельному каналу:Приемник читает значение очередного бита с линии данных только в момент получения тактового импульса, который генерируется передатчиком примерно в середине каждого бита, таким образом отпадает проблема синхронизации между передатчиком и приемником.
Но как быть, если провод для передачи данных один единственный? Для этого придумали различные методы кодирования сигнала, наиболее известным из которых является манчестерское кодирование:
Манчестерский код довольно прост в понимании и реализации: в нем нулевые и единичные биты исходных данных кодируются направлением изменения сигнала (0-1 или 1-0) в середине каждого бита. Тем не менее есть еще более простые способы передачи данных, особенно если не столь важна скорость.
EV1527
EV1527 — это один из самых популярных аппаратных кодеров/декодеров для использования в различных радиоуправляемых устройствах (розетках, лампах, воротах, шлагбаумах). Интересен он в первую очередь тем, что использует очень простой ШИМ-подобный метод кодирования информации, заключающийся в том, что логические нули и единицы в сигнале кодируются разным соотношением длительности импульса и тишины:Единичный бит кодируется последовательностью {3; 1}, т.е. сначала в течение 3-х некоторых отсчетов времени предается высокий уровень, а затем 1 отсчет времени — низкий. Нулевой бит имеет обратные значения {1; 3} — 1 высокий импульс и 3 низких. Длина единичного отсчета времени (импульса) у EV1527 составляет 350 микросекунд. Кроме того, перед данными передается особая преамбула, имеющая формулу {1; 31}:
Она позволяет приемнику отследить начало передачи данных и начать их принимать. В зависимости от реализации преамбула может передаваться как в начале, так и в конце посылки. Это не играет большой разницы, так как в целях повышения надежности посылки с сообщениями отправляются многократно (10 и более раз подряд). Кодированная данным протоколом единичная посылка из 8 бит двоичного числа 10101010 выглядит как-то так:
В стандартном исполнении посылки EV1527 имеют длину 3 байта (24 бит), но что мешает нам в личных целях использовать любой размер передаваемых данных? В идеальных условиях — ничто не мешает, но в реальности слишком длинные сообщения данным методом передавать не выйдет из-за помех и отсутствия какого-либо устранения ошибок. Тем не менее, для отправки коротких посылок с данными на 2-4 байта этот протокол подходит отлично, к тому же он поддерживается сторонними библиотеками для Arduino (например, RCSwitch) поэтому я решил реализовать именно его. Существует множество разновидностей таких протоколов, есть даже трехуровневые (tri-state) вариации, где бит помимо стандартных «0» и «1» может принимать третье значение «F» и называется трит, но я реализовал только самый простой вариант — двоичный.
Программная реализация
Благодаря своей примитивности метод кодирования/декодирования легко реализуется программно и занимает очень мало места. Настолько мало, что код приемника и передатчика можно уместить в ATtiny13 с 1024 байтами памяти, и еще останется место для какой-нибудь полезной работы (!) Я не буду подробно расписывать код, он довольно короткий и хорошо задокументирован. Исходники и примеры доступны здесь и распространяются под MIT лицензией. Как вы догадываетесь, вся библиотека — это один лишь заголовочный файл tinyrf.h.Процесс отправки и приема сообщений завязан на аппаратном таймере (у ATtiny13 он один единственный), вычисление настроек таймера выполняется на этапе компиляции с учетом тактовой частоты микроконтроллера, поэтому в проекте обязательно должна быть объявлена директива F_CPU с указанием тактовой частоты в герцах (например, 1.2 МГц = 1200000 Гц). В целом поддерживаются все основные частоты (0.6, 1.2, 4.8, 9.6 МГц), на других совместимых микроконтроллерах с другими частотами (например, 16.5 МГц на ATtiny85) тоже нет никаких проблем.
Таймер (а точнее тактовый генератор) у ATtiny может быть очень кривым, поэтому при каких-либо проблемах с приемом/передачей в первую очередь необходимо попробовать подкрутить F_CPU, а в идеале — откалибровать генератор. С этим я столкнулся, когда проверял правильность отсчета времени таймером. Так по мнению ATtiny13, работающего на частоте 4.8МГц, выглядит меандр с шириной импульса 350 микросекунд:
Поначалу я грешил на вычислительные затраты, но при понижении до частоты 1.2 МГц ситуация наоборот улучшилась:
Разгадка оказалась проста — у многих версий ATtiny13 внутри стоят 2 разных тактовых генератора: на 9.6 МГц и 4.8 МГц, причем первый более-менее откалиброван с завода, а второй — как получится. Частоты 1.2 МГц и 0.6 МГц соответственно получаются с помощью деления на 8, поэтому погрешности сохраняются. Тем не менее, как показали эксперименты, разница в 50мкс оказалась несущественной, поэтому прием/передача практически всегда работают нормально без лишних калибровок и настроек.
Обобщенный пример передачи сообщений:
// Шаг 1: задаем параметры
#define F_CPU 1200000UL // Тактовая частота МК в Гц
#define TRF_TX_PIN PB1 // Пин, к которому подключен передатчик (если не указано - используется PB0)
#define TRF_DATA_SIZE 2 // Размер сообщения в байтах (если не указано - используются 3 байта)
#define TRF_RX_DISABLED // Исключить код приемника для экономии места
// Шаг 2: подключаем библиотеку
#include "tinyrf.h"
// Шаг 3: вызываем инициализацию
// Если ваш код не меняет настройки прерываний и таймера, то вызвать инициализацию можно один раз при запуске
// иначе следует вызывать инициализацию каждый раз перед тем, как хотим отправить сообщение
trf_init();
// Шаг 4: готовим сообщение и отправляем его
uint8_t message[TRF_DATA_SIZE] = { 123, 234 };
trf_send(message);
Обобщенный пример приема сообщений:
// Шаг 1: задаем параметры
#define F_CPU 1200000UL // Тактовая частота МК в Гц
#define TRF_RX_PIN PB0 // Пин, к которому подключен приемник (если не указано - используется PB1)
#define TRF_DATA_SIZE 2 // Размер сообщения в байтах (если не указано - используются 3 байта)
#define TRF_TX_DISABLED // Исключить код передатчика для экономии места
// Шаг 2: подключаем библиотеку
#include "tinyrf.h"
// Шаг 3: вызываем инициализацию
// Если ваш код не меняет настройки прерываний и таймера, то вызвать инициализацию можно один раз при запуске
// иначе следует вызывать инициализацию каждый раз перед тем, как хотим начать принимать сообщения
trf_init();
// Шаг 4: проверка наличия нового сообщения
if (trf_has_received_data()) {
// Шаг 5: подготовка буфера и чтение в него сообщения
uint8_t data_buffer[TRF_DATA_SIZE];
trf_get_received_data(data_buffer);
// Шаг 6: проверка корректности полученного сообщения и выполнение требуемых действий
if (data_buffer[0] == 123 && data_buffer[1] == 234) {
...
}
// Шаг 7: сброс флага наличия сообщения для приема следующего
trf_reset_received();
}
Как видно, некоторые параметры можно конфигурировать с помощью директив, можно даже частично перенастроить сам протокол. Полный список доступных директив можно найти здесь
Примеры использования
От примеров теоретических предлагаю перейти к примерам практическим. В первую очередь помимо микроконтроллеров нам понадобятся передатчики и приемники, я взял самые дешевые на 433.92 МГц:- Передатчик — FS1000A
- Приемник — MX-RM-5V
Пример №1 — управляем светодиодами
Исходник. Пример по сути представляет собой реализацию радиореле на 4 канала: передатчик последовательно передает 8 различных команд (4 на включение и 4 на выключение) с интервалом по 0.5 секунды между ними, приемник принимает и зажигает/гасит светодиоды, которых у него 4.Схема приемника:
Для тестов я собрал его из подручных материалов на обрезке макетки:
Для увеличения дальности следует припаять к приемнику обрезок провода длиной 17.3 см. Скомпилированный с оптимизацией по размеру пример приемника занимает 636 байт (62% памяти микроконтроллера), причем довольно много весит сама логика проверки сообщений. Тем не менее, еще остается достаточно места на добавление каких-либо действий.
Схема передатчика:
В качестве антенны — такой же кусок провода:
Пример работы:
Передатчик весит заметно скромнее — всего 286 байт (28%), что дает пространство для маневра и добавления целой кучи своей логики. Дальность уверенной связи — около 20 метров по прямой или в пределах одной комнаты, в первую очередь из-за шумности приемника. Кроме того, как выяснилось, приемник работает нормально только в узком диапазоне напряжений питания (4-5В), в остальных случаях безбожно шумит и не может обеспечить нормальный сигнал на выходе даже при передаче «в упор».
Библиотека совместима с некоторыми другими микроконтроллерами из серии ATtiny, один из них — ATtiny85, который известен тем, что используется в Arduino-совместимой плате Digispark. Это сильно упрощает эксперименты, потому что его можно прошить через обычный USB порт из Arduino IDE без всяких программаторов. Я портировал пример мигания светодиодами в скетч для заливки в Digispark с той лишь разницей, что вместо управления 4-мя внешними диодами в нем переключается только 1 светодиод, встроенный в Digispark (висит на пине PB1). Важно отметить, что в скетчах не нужно указывать частоту в F_CPU, потому что Arduino IDE подставляет ее сама при компиляции.
Схема приемника и передатчика:
Пример работы:
В приведенном примере представлен простой и немного избыточный, но действенный способ проверки целостности коротких сообщений. Фактически размер команды — 1 байт, вторым байтом в сообщении отправляется инвертированное значение первого:
{ 11, (uint8_t) ~11 }
Приемник предварительно проверяет корректность полученной команды, пытаясь сравнить на равенство:
if (data_buffer[0] == (uint8_t)(~data_buffer[1])) {...}
В случае ошибок при приеме равенство не выполняется, и команда игнорируется. Такой способ проверки достаточно надежен, я поэкспериментировал и не заметил ложных срабатываний в течение нескольких дней непрерывной работы, но в реальных ответственных сценариях использования стоит усилить защиту дополнительными проверками.
Пример №2 — приемник и передатчик в одном флаконе
Исходник. Библиотека довольно компактная и построена таким образом, что использует одни и те же настройки таймера как для приема, так и для передачи сообщений, плюс на время передачи сообщений прерывания по портам отключаются. Благодаря этому коды приема и передачи сообщений можно уместить на одном микроконтроллере, главное подключить приемник и передатчик к разным пинам. Следующий пример демонстрирует простейший эхо-репитер и работает следующим образом:- Слушает эфир и ожидает получения 2-байтовой команды (из предыдущего примера)
- После получения команды выжидает 2 секунды и ретранслирует ее повторно с помощью передатчика
- Ожидает следующую команду
Скомпилированный код весит всего 576 байт (56% памяти ATtiny13), что даже меньше, чем в примере управления светодиодами. Как вы догадываетесь, с помощью этого репитера можно увеличить дальность работы предыдущего примера, если разместить его между приемником и передатчиком (предварительно уменьшив время задержки до 250-500 мс).
Версия для Digispark:
Чтобы сделать пример более осязаемым предлагаю на примере скетча для Digispark немного видоизменить код повторителя, сделав из него «инвертор»: при получении команды на включение светодиода (11, 22, 33, 44) он будет с задержкой 250 мс передавать в эфир обратную ей команду на выключение (55, 66, 77, 88):
#define TRF_RX_PIN PB0 // Приемник на PB0
#define TRF_TX_PIN PB1 // Передатчик на PB1
#define TRF_DATA_SIZE 2 // 2-байтовая команда
#include "tinyrf.h"
#include <util/delay.h>
// Команды включения
byte commands[4] = {11, 22, 33, 44};
// Обратные команды выключения
byte inv_commands[4][TRF_DATA_SIZE] = {
{ 55, (byte) ~55 },
{ 66, (byte) ~66 },
{ 77, (byte) ~77 },
{ 88, (byte) ~88 }
};
void setup() {
trf_init();
}
void loop() {
// Получена новая команда
if (trf_has_received_data()) {
// Извлекаем данные
byte data[TRF_DATA_SIZE];
trf_get_received_data(data);
// Проверяем корректность
if (data[0] == (byte)(~data[1])) {
// Ищем обратную команду и отправляем
for (byte i = 0; i < 4; i++) {
if (commands[i] == data[0]) {
_delay_ms(250);
trf_send(inv_commands[i]);
}
}
}
// Разрешаем прием следующей команды
trf_reset_received();
}
}
И если раньше переключение светодиодов происходило так:
То со включенным находящимся рядом «инвертирующим повторителем» оно происходит так:
Т.е. повторитель принимает «включающие» команды одновременно с основным приемником и с небольшой задержкой перебивает их своими «выключающими».
Итог
Кому-то пост может показаться внезапным и странным, но основная его цель — в очередной раз продемонстрировать, что не стоит списывать со счетов простые железки, ведь при желании из них можно выжать значительно больше. Многие избегали использования в своих проектах ATtiny13 и ему подобных из-за низкой доступности библиотек, но я надеюсь, что с появлением TinyRF, для многих станет одной проблемой меньше. В приведенных примерах показано лишь взаимодействие МК между собой, тем временем TinyRF можно приспособить и для управления некоторыми серийными устройствами вместо пульта, если они используют тот же EV1527-подобный протокол. Этот протокол легко клонируется дешевыми обучаемыми пультами:Поэтому с помощью ATtiny при желании можно добавить радиоуправление в другие существующие устройства — на что хватит фантазии.
Самые обсуждаемые обзоры
+104 |
4196
237
|
+179 |
6426
182
|
+45 |
2225
77
|
+39 |
2278
46
|
Спасибо!
Как раз лежат Спарки и приёмник с передатчиком.
Наконец-то дам им применение
У которого, на минутку, встроенный радиоканал, Bluetooth 5.2, AANT/2.4GHz, ARM Cortex-M4 64MHz, 192kB flash, 24kB RAM. Работает с ардуино иде, если привыкли к нему. 14 бит ацп, 10 бит цап, куча таймеров, компараторов и прочего! При размере модуля 13 на 20 мм.
Таким инженеров, предлагающим такой оверинжиниринг, нужно сразу на вход 220 подавать.
Я кучу таких встречал — надо помигать релюшками — поставим-ка мы ARM, который 99.99999% времени сидит в idle.
Средства должны быть под задачу.
А я вот таких «предлагающих» (да ещё с такой агрессивностью) подобное никогда бы не поднял выше уровня разработки, потому что они не видят дальше своего носа.
И что в этом плохого? Если решение сто́ит тех же или меньших денег, позволяет унифицировать бизнес-процессы, среду разработки, код, команду разработчиков и рассчитывать на более длительный цикл поставок? ARM в 99.9999% idle во многих случаях лучше, чем бесконечный Loop, привычный для многих «ардуинщиков» — хотя бы по потреблению (что для автономных устройств лучше). В конце концов, это всего лишь кусок кремния с примесями…
«Средства под задачу» могут быть разными, и чаще всего городить огород решений много хуже для логистики, производства, разработки и последующей поддержки. «Проще» не всегда значит «лучше».
Там всё обкешировано во всех местах, построены суперэффективные индексы для поиска всякого, и весит это всё много.
Плюс на каждой странице висит по нескольку шпионящих скриптов, собирающих статистику для владельцев сайтов и ещё кучи компании за одно.
Плюс на многих страницах ещё рекламы полно, которая частенько сама представляет собой здоровенное веб-приложение, переусложнённое в каждом месте и, как следствие, требующее всех этих структур данных в большом кол-ве.
Короче, тут куча сторон, которые внесли свою лепту вот в это вот всё.
Надеюсь, рано или поздно популярными станут какие-то показометры, которые будут показывать юзерам, какие вкладки жрут их ресурсы, а те в свою очередь будут голосовать ногами.
Флеш — установка сторонней закрытой библиотеки, в которой, во-первых, могут быть свои дыры, которая, во-вторых, должна существовать под вашу целевую платформу и браузер и которая, в-третьих, должна быть каким-то образом лицензирована для использования в этом самом браузере. Последний пункт, кстати, немаловажен — если бы флеш «зашел», мы бы сейчас имели его с суффиксом СС и по подписке :)
Так что тут я как раз на стороне ЖС. Или любого другого скриптового открытого языка. А проблема с потреблением памяти еще связана с тем, что каждая вкладка (и каждый движок, выполнящий ЖС, соответственно) — это отдельный процесс по соображениям безопасности. Вы об этом и сами писали выше. Но вот что для вас важнее — потратить разово денег на дополнительные 16 Гб памяти и иметь более надежную систему или сэкономить на памяти, но иметь больше шансов на пропажу/утерю ценных данных? Я выберу первое, т.к. я работаю на компьютере, я зарабатываю на нем свой «хлеб», и мне очень важно, чтобы мой рабочий инструмент был максимально защищен. Я даже перестал ставить ломаный софт по этой причине :) Стараюсь или просто купить (Windows, Office), или искать бесплатные аналоги (XnView), но не ставить всякие кряки, патчи и т.п.
Сразу начинаются проблемы — а что, если пользователь не установит и т.д. Это трудности при создании сайтов, которые никому не нужны. Помните времена, когда в коде страницы были проверки на типы браузеров и дальше достижения одной и той же цели разными способами? Это было весьма геморно. Поэтому победа ЖС — эволюционная. Еще, если помните, был некий silverlight от ms — их попытка сделать аналог флеша и «перетянуть» одеяло на себя. Его постигла та же самая участь, он, я бы сказал, загнулся еще в зачаточном состоянии.
Что-то было такое на закате эры флеша. Но, как вы верно заметили, флеш можно было отключать для выбранных сайтов, чем потом занимались абсолютно все браузеры. Был скорее гемор включить его обратно для нужного сайта. Но, опять же, если бы флеш был единственным скриптовым расширением веба, его бы нельзя было отключать — попробуйте сейчас ЖС отключите и посмотрите, хоть одна страница работать будет?
Что касается ссылки на атаку — так там атака на память. В таком случае, её можно провернуть абсолютно на любом скриптовом языке, где есть работа с памятью. То есть, это не камень в огород ЖС, скорее, это камень в огород современных технологий.
Open source — не зло само по себе, он дает много полезных плюшек, но витающие в головах многих иллюзии по поводу его непоколебимости и безопасности приводят к тому, что видим на картинке. Чтобы уверенно утвержать, что открытый код безопаснее закрытого, нужно сначала провести полный его аудит, но кто этим занимался? Более-менее сообщество проверяет только самые широко используемые вещи типа того же V8, и то регулярно находят в нем критические дыры, которые могут висеть по пол года.
Вы похоже не имели дел с Safari) Я конечно не фронтендщик, но периодически слышу вопли про него в стиле тех, которые были лет 15 назад по поводу IE) По мне так как раз с совместимостью флеша и было меньше всего проблем — это была абсолютно идентичная работа в любом браузере на любой платформе. Silverlight тут такой себе пример, этот ms пытался залезть в абсолютно любую нишу и везде все забросил, одни плееры Zune чего стоят.
Так одна из основных задач интерпретатора как раз обеспечить изоляцию между железом и исполняемым кодом, чтобы подобные атаки невозможно было провернуть. Попахивает «неповорачивающейся стрелочкой», типа вы не понимаете, это другое)
А если был бы проприетарный код, типа бы не находили? Windows отлично доказывает обратное. А что касается увеличения случаев взломов — так просто ломать стало больше чего. Сейчас вон бытовая техника в интернет лезет.
К счастью, да) Дома нет ни одного устройства эпл.
ЖС уже давно не интерпретируется (к счастью), скорости не те. А чтобы обеспечивать изоляцию, надо, прежде всего, понимать, где именно она нужна. Кто ж мог подумать про какие-то уязвимости в памяти (!).
Не понимаю, о чем вы.
Подытожив: если бы даже сейчас и существовал еще флеш, никаких проблем он бы не решил. Он бы так же разросся в размерах, как другое ПО, плюс работал бы еще поверх браузера, то есть, процессов и ресурсов надо было бы еще в два раза больше.
Абсолютли, но я изначально приводил его как пример того, что пользователь и даже разработчик больше ни на что не может повлиять, вся эволюция технлологий в вебе — спектакль, разыгрываемый парой монополистов в своих корыстных целях. Флеш был чрезвычайно удобен как для разработчиков, так и для пользователей, а некоторые его возможности до сих пор в принципе нечем заменить, ту же векторную и 3D графику (есть WebGL, но не идет ни в какое сравнение). Для гугла флеш был шилом в заданице, мешавшим рубить деньги на торговле чужой личной жизнью, за что и был технично слит под кучей навязанных предлогов. То, что сама идея flash/silverlight/java апплетов была правильной и до сих пор востребована доказывает тот факт, что этот велосипед пытаются изобрести заново под видом того же wasm
А так, никто не гарантирует, что такого не произойдет и с платной библиотекой.
Как внезапно оказалось, совершенно глупая дыра может долгие годы существовать даже в самом популярном во всем мире проекте, и ни его открытость, ни большое комьюнити, ни ревью всем миром не дают ровным счётом ничего)
— каждая вкладка теперь отдельный процесс. Это требует больше памяти;
— сами веб-страницы стали сложнее — больше картинок, больше скриптов.
А задачи и цели — это уже совсем про другое.
Тут все таки тема больше про домашние поделки в единичных экземплярах. И здесь есть довольно серьзеные недостатки, помимо тех что автор описал:
1) Заливка прошивки — 4 провода. Обычно надо выпаивать самц тини или отпаивать что-то, чтоб не мешало программатору или наоборот.
2) Отладка. debugWire — хорошо, но требует отдельного отладчика. Не знаю как что сейчас, но в свое время «самый дешевый» AVR Dragon обошелся в 80$. Ну и никуда не девается п.1, когда надо dW включить или выключить.
3) Глюки пр отладке — залоченный кристал, ВВ программирование
4) Слет прошивки (сам не наблюдал, но пишут много про это)
5) Слет EEPROM
так обычно эррата затрагивает более серьезные вещи, чем простое мигание светодиодами.
По этому, для «домашнего примения» удобнее будут готовые модули на более современных процах.
Сейчас вместо него Atmel-ICE, в самом дешевом варианте (только плата) за него просят не меньше $100.
Неумелому программатору всегда яйца мешают! :)
Получается, что у нас противостояние дешёвого микрика + такой себе радио + мозг и опыт инженера против дорогого всё-в-одном + быстро наляпать кем угодно. результат одинаковый, по итогу, идёт передача пары байт для включения лампочки.
если такое ставить на конвеер, то я выбиру дешёвый девайс. а ты?)
Если при прочтении не заметили, там были фразы о качестве работы приемника и условиях его работы. Для серийного изготовления это… ну, если только вы будете сидеть и юстировать каждое изделие, лично.
А вы помешались на своём nrf и кроме него смотреть ни на что не можете)))
У nrf bluetooth, в очень многих случаях он дико избыточен и потребляет больше, бьет слабже — ибо заточен под другое. Но вот такие, как Вы, «инженеры», пытаются его сувать везде.
Пример — датчики метеостанций, даже современны — не на BT (хотя есть и исключения, в основном DIY), а почему — оставлю вам домашнюю работу.
Ставится задача и, исходя из имеемых ресурсов, решается.
Вот нужен был таймер для управления УФ лампой. Восьминогого PIC12F629 для него более чем достаточно: для двух каналов управления, для четырёх кнопок и для отображения времени на четырёхзначном семисегментном индикаторе. А всё потому, что кнопки и индикация реализованы на православном 12-битном сдвиговом регистре К155ИР17.
Задача выполнена и повторять схему никто не будет. Можно было наворотить и STM и ардуинку с малинкой впрячь с жк дисплеем, но зачем?
Идея в том, что имея мощный процессор задачи решаются проще и, чаще всего, чисто аппаратными средствами. Что позволяет реализовать шо-хошь и как-хошь.
Задача выдержки по кнопке решается RC(D) цепочкой и MOSFET.
В моём случае нужно было предавать по проводу сигнал эмуляции пульта при крайне ограниченном питании.
PS. Ну и самое главное — я не из тех «ребят с подворотами на гироскутерах», которые «программируют» тетрис размером в пару гигабайт и требованием к железу «минимум i5 8 поколения, 16гиг ОЗУ и видик минимум GTX1050». Из пушки по воробьям — не моё кредо. Посему ставить такой камень для того, чтоб просто «подёргать ножкой» при условии того, что можно вполне обойтись мЕньшим — у меня не поднимется ни рука, ни собственное чувство уважения.
Я тоже начинал с PICов и 51ых. Но в сегодняшних реалиях, уже и не помню, когда последний раз их применял. И да, я не прикручиваю rtos чтобы помигать светодиодом.
Реально. Хотел закупить, а на али меньше доллара нету, а были всегда по 30 центов.
Но тут явно дело не в дальности, а в самом процессе создания на таком мелком таракане.
Вроде как nrf сотню сможет на большей скорости. Но я сравнивал именно с 20 метрами, так как это проверенный вариант, а остальное уже неизвестно.
Давай сравним приёмник-передатчик 433MHz, которые стоят три копейки? И сравним их с nrf, что бы доказать, что наши трёхкопеечные модули дальше добивают.
Только мы свои модули заменим на баофенг радио, которые по 5 ватт и дополнительной антенной и тогда они точно задавят эти галимые nrf.
Profit.
А мне нравится такой подход. Теперь надо придумать где это применить ещё…
Хотя, вижу, что я не прав. Изначально была речь «на порядки». Даже не знаю сколько это в двоичной будет, но точно больше единицы.
Хотя, конечно, учитывая, что радиосигнал ослабевает пропорционально квадрату расстояния, чтобы получить в 10 раз большую дальность, надо улучшить приемопередающую систему в 100 раз. А если речь была о нескольких порядках — то требуемое улучшение становится вообще умопомрачительным. Так что да, тут скорее речь про двоичную систему :)
Но мне сейчас совсем не до этого, так как надо понять что делать со сработавшим исключением по поводу «20 метров». Может, сторгуемся на троичную систему?
Очень полезная статья, спасибо за труд!
Я делал самостоятельно «отправочник» команд на тиньке (точнее даже не самостоятельно — мне помогал товарищ) — и было гораздо «прожорливее», 6 «намертво» забинденных команд и простая передача заняли почти полностью ресурсы тиньки, а хотелось бы еще койкакую логику впихнуть, но увы…
Да и никакие это не «пакеты данных» — это просто «номер кнопки», 4х байтная цифра, FE01FF00, FD02FF00, FC03FF00 итд.
Подбираем нужную скорость uart и пишем в него свои данные — на выходе имеем такой же сигнал (по крайней мере с датчиком температуры прокатывало)
А откуда такая информация? 4.8 как бы равно 9.6/2. Неужели из-за этого стоит отдельный генератор ставить?
OSCCAL=то, что записано на бумажке.
Микросхема древняя, как говно мамонта. Помню, в те времена был софт для программатора (avreal), который вычитывал эту константу калибровки из кристалла и записывал по указанному адресу во флеш, откуда уже программа могла ее считать.
Скорее всего, в более поздних версиях технологии уже усовершенствовались и заметной разницы в потреблении при работе на 9.6 МГц и делении её на два уже не было.
В любом случае, интересная особенность. Я с tiny13 всегда работал только на 9.6 МГц (автономный максимум), поэтому, честно говоря, даже не читал разделы даташита на тему 4.8 МГц.
LDD Rx, Y + n
Это занимает все те же 2 такта, как и команда LDS, но экономит 2 байта. При этом, в attiny13 всего 64 байта ОЗУ, за счет чего такой способ позволяет адресовать его целиком. Дополнительно YH (старшая половина Y) получается нулем, это удобно для некоторых операций.
Вряд ли компилятор будет так делать. Плюс, 32 регистра для большинства алгоритмов — это даже перебор, поэтому я могу взять некоторые регистры (обычно «неполноценные» R0 — R15) и хранить в них данные, используемые обработчиками прерываний. При этом, во всей остальной программе я их использовать не буду никак. Таким образом, можно сократить код еще.
Это как? Не, ну вообще-то 'можно', но лучше заслушать автора, что он имел в виду.
А вообще — исправте, так говорить нельзя.
Что до передачи данных по одному проводу, именно одному, то это тоже возможно.
Подумайте. ))
Вопрос не совсем надуманный, так можно передавать команды устройству, имеющему только конструктивное соединение (например, смонтирован на металлическом швеллере)
Можно сделать и без перехода на радиачастотный метод. К слову, а зачем козе баян?… если РЧ, то «провод» то нафига?, даже «один». )))
Нет, почти, но не так. «Так» — использовать тот эффект, что любой физический объект имеет емкость. Как пытались учить на уроках физики, между двумя обектами всегда есть емкость. Один объект у нас всегда есть (и это здорово) — планета Земля. А значит, любой объект имеет емкость на_нее. Вроде просто, но почему-то об этом мало кто думал. ))
А значит, передача по 1 проводу возможна, при условии учета, что вторым «проводом» будет относительно небольшая «емкость». Тут DC уже не катит (и, см. обзор), а импульсы должны быть… в виде импульсов — коротких и, желательно, побольше. Думаю, суть идеи понятна. У этого способа масса ограничений, но иногда он «выстреливает» очень красиво.
мне как раз на днях понадобился проект для работы с выключателем по радио, вот таким:
мне нужно было чтобы выключатель(т.е. реле, вот та крошечшная платка) работал не от брелка, а от арудинки.
ни малейших проблем, считал код брелка простейшим rf-приемником, и лехко запустил такой же код с ардуинки:
т.е. у вас весь цимес в том что это не ардуинка а ATtiny?
Ну, наверное достойно, а практический смысл? сейчас есть ардуинки крошечные и грошовые… это что-то вроде троллейбуса из буханки хлеба?
хотя если это чисто спортивный интерес, типа графической демки в 64 байта, тогда конечно…
Это Arduino beetle.
20x22 mm, 16 MHz, $7.80
вот пример использования в моем проекте:
А мне за $8 в высшей степени плевать сколько там io, хоть 6, хоть 666.
Соглашусь также что можно напрягшись выдумать уникальную ситуацию когда размер «0.5x1» абсолютно критичен, наличие кварца недопустимо, максимальный допустимый ток потребления 0.5 мА.
С удовольствием посмотрю на ваши «многие» законченые проекты для практического применения с указаными ограничениями.
А пока выглядит именно троллейбусом из буханки хлеба. Как вы говорите, «не серьёзно».
Но опять же соглашусь что описаный проект это «демонстрация» того что можно «выжать». Это очень похоже на т.н. «демосцену» с графическими демками в 64 байта.
Что же, имеет право на существование.
По размеру даже поменьше вашей ардуины, зато не обязательно физически к компьютеру подключаться, можно управление через WiFi реализовать, можно через веб страницу, которую с телефона открывать.
я считаю что wifi действительно нужен только в очень немногих случаях.
Например, свое устройство я подключаю к десктопу у которого вообще wifi отсутствует.
Если и тут не улавливаете, почитайте топик. Речь в нем о применении attiny для передачи данных по RF, с многочисленными ухищрениями. При этом разные персонажи настаивают что именно attiny незаменим в «многочисленных» случаях такой связи по RF.
Кому проще готовое — пусть использует готовое. Кому дешевле сэкономить время — тоже нет проблем.
Тут не о чем спорить, мы же не на конкурсе лучших решений по каким-то критериям…
Плюс, однозначно.