Arduino осцилограф на JAVA

ich
Offline
Зарегистрирован: 10.06.2012

Сталкнувшись с отсутствием осцилогрофа, в домашнем хозяйстве, надумал написать что-нибудь подобное на JAVA. Так как с потоками шибко не работал, наткнуля на нехватку идей.

Вот что имеется на данный момент:

 

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

После старта программы нужно нажать на Refresh, чтобы получить список Портов. После этого выбераем порт, скорость и тычим на кнопку Connect. После соединения с портом средняя часть работает так же как Arduioвский монитор. Правая часть "quick kays" для быстрого отправления данных. К каждой из 8ми ячеек можно присвоить конкретную кнопку с клавиатуры и значение которое должно быть отправлен в порт при нажатии на кнопку. Это всё работает.

Хочу запустить осцилограф. А вот как это всё должно работать понятия не имею.

Что я уже надумал по поводу осцилогрофа:

1. Будет 2 модуса. Дигитальный (принимаемые значения 0 и 1) и Аналогавый (принимаемые значения от 0 до 1023).

2. Буфер данных. Указывает сколко последних точек должно быть показано на мониторе. (пока не зню нужно ли вообще).

Проблема у меня с преоброзованием данных из потока в данные для осцилографа. Как определить что число закончилось и пошло новое? Я подумал, буду отправлять данные и разделять их пробелом или NL, т.е. пока разделитель не появился, значит число отравленно не доконца (ждём пока всё число не прейдёт). Полученые значения сохраняю в арэи и храню там последние N значений, которые показываю на мониторе. Но тут есть одно но, как мне в таком случае отслеживать время каждого значения?

Да и вообще я считаю что время самая большая проблемма. Есть какие-нибудь предлажения по этому поводу?

Вот тут актуальная версия.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Записывайте оцифровку в буфер на ардуино, потом формируйте пакет из признака начала передачи, метки времени и блока данных в бинарном формате. Потом весь блок посылаете на комп.

Вообще, задача "осциллограф" достаточно нетривиальная. Советую сначала полностью описать алгоритм, разбить на части и реализовывать по частям.

А смотреть, что это Вы там наваяли, самому разбираться в вашем проекте... как то не хочется. Конкретнее нужно, конкретнее... 

ich
Offline
Зарегистрирован: 10.06.2012

AlexFisher пишет:

А смотреть, что это Вы там наваяли, самому разбираться в вашем проекте... как то не хочется. Конкретнее нужно, конкретнее... 

Пока шипко много и не написано. Так что разбираться то и не счем. Да я и не хочу кого-то нагружать самой писаниной кода. Буду как-нибудь сам. Проблема в подходе к проблеме. Как это всё "начать", и желательно как можно правельней.

Моя первая идея была, просто отправлять значения друг за другом и потом уже на компе их обрабатывать. Идея была сразу же обречена на провал из за измерения времени. Так как на комп данные идут через сериал "с одной скоростью". На эту идею меня наталкнул какойто Arduinoskop из интернэта, каторый у меня так и не заработал. Там якобы достаточно отправить на порт пакет вот в таком виде:

Serial.begin(9600);
Serial.print(1);
Serial.print(" ");
Serial.print(2);
Serial.print(" ");
...
...
...

Но увы не так то это всё просто. Откуда пограмме знать когда был отправлен какой пакет. По этому эта идея отвалилась.

 

AlexFisher, благодарю вас за идейку с подготовкой данных на самой Arduino. Теперь я думаю надо как-то так попробывать:

Дапустим я напишу класс для Arduino, каторый будит сабирать данные и по сигналу слать их на комп.

Osziloskop oszi(9600,2); // Инициализируем осцилоскоп. 9600 - скорость на пору, 2 - колличество каналов

int value;
while(какое-нибудь условие){
   // происходит какое-то действие каторое должно быть измеренно, например:
   value = digitalRead(2); // Читаем пин
   oszi.save(1, value); // сохраняем данные в осцилоскоп на ардуине
   // 1-Номер канала
   // value - значение
   // функция "save" внутри автоматически сохраняет время получения значения.
   
}

// после того как измерения закончились, шлём всё на комп
oszi.send(); // Тут уже собранные данные поехали на комп.

У меня по поводу этой идеи есть маленький вопрос. Как долго/много сможет сабирать "save(1, value)" данные? Ведь память то у ардуины не бесконечная, даже болше скажу: очень мало. Может установить кокойнибудь флаг, например после 100 сохранений шлём данные автоматически. Но тогда на время отправки данных скетч остоновится. Не думаю что это будит везде пофиг. Где-то на этом форуме натыкался на отправку данных через Serial без остановки скеча. Думаю в этом случае именно туда и надо будет рыть.

Есть шанс на жизнь у такогй идеи?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Я думаю, Вам не следует отправлять сигнал постоянно. Вам следует озаботиться, скажем, синхронизацией. analogRead медленная, поищите на форуме я давал ссылку на инструкцию, как ее ускорить. Нужно оцифровывать в буфер, по окончании (буфера) - передавать. Если же хотите слать "сплошным потоком", то придется обойтись без функции analogRead, нужно делать прерывание по окончании преобразования АЦП, которое будет записывать данные в кольцевой буфер и запускать следующее преобразование, а loop() Вы преспокойненько передаете данные как хотите. При этом оцифровка будет равномерной - можно обойтись одной меткой времени - для начала буфера.

Можно аналогичным образом с помощью убыстренной analogRead оцифровывать сигнал по прерыванию от таймера (ищите библу TimerOne или Timer2) - тогда вообще метки времени будут строгие. 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Я использую вот такой осциллограф на arduino

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Полезная ссылка. Я оттуда библиотечку SmallUart утянул - может быть полезна, потому что реально мелкая и не использует прерываний. Правда, и буфер не использует тоже... поэтому при передаче может повиснуть на ожидании конца отправки байта. 

ich
Offline
Зарегистрирован: 10.06.2012

Ребята, гляньте пожалуйста вот это чудо: AVR DSO DSO150 Mini

- 1) могу я это чудо как полноценный осцилограф юзать (просто взять как он есть, не подключая к ниму ни чего)?
- 2) правельно-ли я думаю: прибор работает до 60M Hz, Ардуина 16M Hz Т.е. для эксперементов над ардуиной его хватит мне "по заглаза"?
- 3) если эта игрушка может работать как полноценный Осцилограв, зачем ей надо USB кабель? Не проще было бы его просто запитать от батарейки? Или это для того чтобы можно было его программировать (Это же по сути тот же ардуино)?

И что на счёт этого ARM DSO201?
Судя по полосе пропускания 0 — 1М Гц для ардуины  16M Hz он не поканает. Да и ещё одноканальный :-(

step962
Offline
Зарегистрирован: 23.05.2011

ich пишет:
Ребята, гляньте пожалуйста вот это чудо: AVR DSO DSO150 Mini

- 1) могу я это чудо как полноценный осцилограф юзать (просто взять как он есть, не подключая к ниму ни чего)?


Нет. Просто потому, что чудес не бывает. Вы будете использовать это чудо как модель неполноценного осциллографа.
Цитата:

- 2) правельно-ли я думаю: прибор работает до 60M Hz, Ардуина 16M Hz Т.е. для эксперементов над ардуиной его хватит мне "по заглаза"?

Вы думаете правильно - прибор работает "до 60 MHz", а точнее (написано ниже) - ок 10 kHz ("2)250Ksps rate (500ms/200ms/100ms/50ms/20ms/10ms/5ms/2ms/1ms/500us/200us/100us)"). Что вполне соответствует реальной скорости работы АЦП в микроконтроллерах AVR - 8-10 тыс. выборок в секунду, до 86900 - при очень удачной конфигурации данных и минимальной точности измерений. ("13 - 260 μs Conversion Time")
Цитата:
- 3) если эта игрушка может работать как полноценный Осцилограв, зачем ей надо USB кабель? Не проще было бы его просто запитать от батарейки?

У этой - как вы правильно заметили - игрушки память всего 1 кб (ATMega88). В ней можно разместить хорошо, если сотню результатов измерения (ведь оперативка и под другие нужды будет расходоваться). 
Цитата:
Или это для того чтобы можно было его программировать (Это же по сути тот же ардуино)?

Все с точностью до наоборот - это Arduino по сути тот же AVR
Цитата:

И что на счёт этого ARM DSO201?
Судя по полосе пропускания 0 — 1М Гц для ардуины  16M Hz он не поканает. Да и ещё одноканальный :-(

"Этот" раз в 100 шустрее "того". Ну пусто не в 100, а в 50.
Но шустрее.
И точно может обходиться без подключения к компьютеру - запоминает до 4096 результатов измерения.



UPD: будучи профаном в области измерений, могу ошибаться.
Даже в разы.
Но вряд ли на порядки.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Я тут ошибочку Вашу заметил :)
Вот данные об этой игрушке:

Feature:

1) 2x DC Channel (Max 5V.)
2) 250Ksps rate (500ms/200ms/100ms/50ms/20ms/10ms/5ms/2ms/1ms/500us/200us/100us)
3) USB power
4) AVR 8Bit Core
5) Dimension 5cm x5.2cm x 1.3cm
6) 2.1" GLCD   128x64 KS0108
7) slop +/-, 5%
8) trigger level"0-5.1"

Из чего чледует, что контроллер не занимается оцифровкой, потому что ему 250 килосэмплов не потянуть (максимум 10). Там стоит АЦП, которая грузит данные во внешнюю память, а контроллер занимается тем, что их читает и выводит на экран.
Для работы с дуиной должно хватить. В целом, этот осцил предназначен для звукового сигнала (до 20 кГц - там будет 12 выборок за период) 

ich
Offline
Зарегистрирован: 10.06.2012

step962 пишет:

Нет. Просто потому, что чудес не бывает. Вы будете использовать это чудо как модель неполноценного осциллографа.

Да, тут что-то я загнул на счёт полноценного.
- Но ведь этой модэли хватит для домашнего использования, т.е. для тестирования ардуины?
- Или то что вы писали о памяти в 100 кБ и ~100 результатах измерений является огромным минусом для моих потребностей?

step962 пишет:

Все с точностью до наоборот - это Arduino по сути тот же AVR

Согласен, перепутал. Но вопрос о USB так и стоит. Зачем? Наврядли только для питания.
Драйверов с ним ни каких нет, по этому производитель и не думал о том чтобы осцилограф юзался с компом, а не говоря уже о его программированние.

step962 пишет:

"Этот" раз в 100 шустрее "того". Ну пусто не в 100, а в 50.
Но шустрее.
И точно может обходиться без подключения к компьютеру - запоминает до 4096 результатов измерения.

Если я предположу что "Этот" это ARM DSO201 а "Тот" это AVR DSO DSO150 Mini.
То вы говорите что ARM DSO201 на порядок лучше AVR-овского. Так ли это?
А как насчёт того что у ARM DSO201 полоса пропускания 0 — 1МГц?
Это же на порядок меньше чем у AVR DSO DSO150 Mini с его 60МГц. При ардуиновской частоте 16МГц такой осцилограф (ARM) вообще ни "какой". Или я что-то путаю?

AlexFisher пишет:

Из чего чледует, что контроллер не занимается оцифровкой, потому что ему 250 килосэмплов не потянуть (максимум 10). Там стоит АЦП, которая грузит данные во внешнюю память, а контроллер занимается тем, что их читает и выводит на экран.
Для работы с дуиной должно хватить.
...

Т.е. проблема с ~100 результатоми решена?
Что значит внешняя память в этом случае? Я надеюсь это флэш на самом осцилоскопе а не этот коварный USB (т.е. как память служит комп через USB).

И последнее:
Мне всего навсего нужно тестировать ардуину. По возможности точнее и как можно меньше гемороя. Например с ARM DSO201 для меня всё понятно, включил и юзай (хотя вот насчёт точности я не уверен). А вот AVR DSO DSO150 Mini как-то смущает (но вот мне кажется что он будит по точней).

Что бы Вы посоветовали мне преобрести?
Не охото выкинуть деньги на ветер.

step962
Offline
Зарегистрирован: 23.05.2011

ich пишет:

Это же на порядок меньше чем у AVR DSO DSO150 Mini с его 60МГц. При ардуиновской частоте 16МГц такой осцилограф (ARM) вообще ни "какой". Или я что-то путаю?


Нет там никаких 60 МГц. Видимо, у продавца деление на группы товаров (осциллографов) специфическое - "меньше 60 МГц" (0,25 МГц - это ведь меньше 60?) и "больше 60 МГц". Частота сэмплирования у DSO150 - в лучшем случае 250 ксэмплов (как это в характеристиках на странице по приводимой вами ссылке - только чуть ниже - указано). Это соответствует полосе пропускания в пределах от 80 кГц (=250/3) до 180 кГц (250/1,4). Истина, как всегда, где-то посередине.

А у DSO210 в качестве "сердца", вроде бы мк серии STM32F1xx. Три АЦП, каждый из которых способен выполнить до мл-на выборок в секунду. Поскольку у прибора канал всего один, то, видимо, все три АЦП считают по очереди, т.е. выдают на гора до 3 Мсэмплов/сек. Это соответствует полосе пропускания 1-2 МГц. Вроде бы совпадает с приводимыми характеристиками.

Цитата:

Мне всего навсего нужно тестировать ардуину.

А вы уверены, что вам именно осциллограф нужен, а не логический анализатор?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

ich пишет:

Что значит внешняя память в этом случае? Я надеюсь это флэш на самом осцилоскопе а не этот коварный USB (т.е. как память служит комп через USB).


Микросхема памяти, конечно, в осциллоскопе!!! Если с ним нет ПО, то УСБ или для питания, или еще для программирования проца.

ich
Offline
Зарегистрирован: 10.06.2012

step962 пишет:
А вы уверены, что вам именно осциллограф нужен, а не логический анализатор?

Не уверен, так как точной разници между осцилографом и анализатором я не знаю. А то что знаю говорит о том что мне надо осцилограф. (Мне известно о анализаторах, что у них только три выда принмаемого сигнала 0/1/неизвестен. Т.е. Бинерно, а мне надо и АЦП мерить а там промежуток между 0 и 1023)

Значит из двух преведённых лучше преобрести ARM DSO201?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Конечно! Частота дискретизации в 4 раза выше и 12 бит АЦП (в том, который выше, наверняка 8 бит)