ардуино + ДЕЛФИ

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
alex2485as
Рядовой
Сообщения: 8
Зарегистрирован: 27.12.2015{, 15:25}
Репутация: 1
Откуда: Армавир

ардуино + ДЕЛФИ

#1

Сообщение alex2485as » 14.05.2016{, 15:48}

Всем привет , НУЖНА ПОМОЩЬ  .
Задача такая;
нужен обмен данными ардуино с компъютером через Com порт.
мне нужно измерить вес в граммах с помощью тензодатчика и передать значение на компьютер через com порт , тот же UART и соответственно тот же USB порт который есть на ардуине. В делфи написана программа, которая соединяется с ардуинкой и можно наблюдать эти самые данные веса. Тут же кнопки управления включением и выключением пинов на ардуине.
Я экспериментировал на Ардуино Nano ATmega328.
flpor 1.10.3
Delphi 7
Начал эксперименты свои просто с передачи данных по USB собственно через который программируется сам ардуино .
Выкладываю свои результаты .
Все работает если обмен производить 8-ми разрядными регистрами тобишь формат слова в ардуине - byte    , а       в делфи -Word.
я выложил как раз рабочую версию.
Проблемы начинаются когда я пытаюсь передать данные из ардуино на компьютер число любого другого формата, мне нужно передавать число с плавающей запятой то есть формат слова - Float -на ардуине     , а в делфи     cкорее всего REAL.
В общем я пробовал все форматы Integer, float. ну все которые там вообще есть=-)))....в итоге ниче не получилось...
Если кто нибудь имеет опыт работы с Делфи может сможете помоч...откорректировать мою программу так чтобы с ардуино на компьютер передать число с плавающей запятой...либо хотя бы в формате INTEGER......Заранее спасибо....
Вложения
eksperiment.rar
(1.05 МБ) 73 скачивания
Последний раз редактировалось alex2485as 14.05.2016{, 15:50}, всего редактировалось 1 раз.

NightScream
Рядовой
Сообщения: 21
Зарегистрирован: 29.02.2016{, 10:58}
Репутация: 0
Откуда: Краснодар

ардуино + ДЕЛФИ

#2

Сообщение NightScream » 14.05.2016{, 22:37}

Скачивать ничего не хочется, лучше б показали что отправляли и массив который приходит.
Не понятно это
alex2485as писал(а):в итоге ниче не получилось...
что именно не получилось???
Всё передается БАЙТАМИ и преобразовывать в любой другой формат будете сами
НАПРИМЕР
передаёте ИЗ ардуино INTEGER (он 2х байтовый) и число = 520
В ДЕЛФИ придёт 2 байта, старший и младший
старший будет равен 520\256=2
младший будет равен 520 - (256 * 2) = 8

С REAL всё намного сложнее
ПОЭТОМУ
делаёте проще, ваше дробное умножайте число на 10 или 100, смотря сколько знаков хотите
передавайте в делфи и потом это число делите на 10 или 100 + как там не помню inttofloat чтоли.

ПРИМЕР 2
есть у вас дробное число 300.1
умножаем на 10, получаем 3001
получаем старший и младший бит и передаём делфи
3001 \ 256 = 11 первый байт
3001 - (256 * 11) = 185 второй байт
делаем массив и кидаем в делфи
в делфи принимаем и делаем наш real\float
myFloat = inttofloat((buf[1] * 256 + buf[2]) / 10);//синтаксические ошибки имеют место быть, давно не трогал паскаль

Еще я бы использовал softSerial, а пины 1 и 0 не трогал т.к. загрузка через них и каша получится в делфи, exception обеспечен.

--------
Встречный вопрос.
Расскажите подробнее о том, какой тензодатчик подключили к ардуино? как?
Давно интересовался этим вопросом, сам работаю на предприятии в основном с Z-SG модулями, но интересно как оно обстоит у ардуино, для некоммерческого учета может что-нибудь и соберу, заранее спасибо.
Последний раз редактировалось NightScream 14.05.2016{, 22:45}, всего редактировалось 1 раз.

alex2485as
Рядовой
Сообщения: 8
Зарегистрирован: 27.12.2015{, 15:25}
Репутация: 1
Откуда: Армавир

ардуино + ДЕЛФИ

#3

Сообщение alex2485as » 15.05.2016{, 00:52}

NightScream , нуу я вас примерно понял передовать частями , массивами я еще не пользовался , завтра попробую разбить на два слова и частями передавать , потом слепить в делфи обратно....спасибо за идею, попробую.....

вот переменные в делфи и настройки ком порта

  out_data  :word;  //   регистр для передачи и приема данных (0-255)
  in_data   :integer;  //   регистр для передачи и приема данных

implementation

{$R *.dfm}

// настройка порта !!! регистр "DCB.BaudRate" отвечает за скорость передачи данных !!!
//......................................................
//......................................................
procedure TForm1.Button1Click(Sender: TObject);
begin
KolByte:=0;
CommHandle:=CreateFile(PChar(ComboBox1.Text), GENERIC_READ or GENERIC_WRITE, 0,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
GetCommState(CommHandle, DCB);
DCB.BaudRate:=9600;
DCB.Parity:=NoParity;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
SetCommState(CommHandle, DCB);

if (CommHandle=invalid_handle_value) then ShowMessage('НЕТ ПОДКЛЮЧЕНИЯ!') else
ComboBox1.enabled:=false ; ShowMessage('ПОРТ ОТКРЫТ!');
end;
//......................................................
//......................................................

далее индицируем 

// ОПРОС ПРИНЯТЫХ ДАННЫХ С ПОМОЩЬЮ ТАЙМЕРОВ
procedure TForm1.Timer3Timer(Sender: TObject);
begin
timer4.Enabled:=true;    //   запускаем второй таймер
timer3.Enabled:=false;   //   отключаем первый

//..........ПРИНИМАЕМ ДАННЫЕ С КОНТРОЛЛЕРА
KolByte:=1;

readFile(CommHandle,dTransmit,KolByte,KolByte,@Ovr);
in_data:=dTransmit[0]; // содержимое регистра "dTransmit" передаем в "in_data"
edit2.Text:=floattostr(in_data); // индицируем покозания принятых данных с контроллера
end;

А насчет тензодатчика - это будет мой следующий шаг после того как добьюсь передачу данных нормально на компьютер.
Пока что идея подключить тензодатчик к операционному усилителю и подать на аналоговый вход ардуинки....
Есть платы для тензодатчиков на алиэкспрессе для ардуино , там по моему связь по I2C   насколько помню, но пока в FLProg в библиотеке этот блок еще не создан-))))...А хотелось быыы..
А пока что придется пробовать вот к примеру по такой схеме и подать на аналоговый вход ардуино...
Вложения
9038473.gif
Последний раз редактировалось alex2485as 15.05.2016{, 01:23}, всего редактировалось 1 раз.

alex2485as
Рядовой
Сообщения: 8
Зарегистрирован: 27.12.2015{, 15:25}
Репутация: 1
Откуда: Армавир

ардуино + ДЕЛФИ

#4

Сообщение alex2485as » 15.05.2016{, 01:25}

если 8 разрядное слово передаю формат byte то отпровляемые данные от 0-до 255 соответствуют принятым на компе...
Когда же ставлю в FLP формат слова integer условно и переменная в делфи тоже integer то при отправке с ардуино числа 1000 на компе я вижу значения какие то непонятные , то 24, то 124 , только не 1000......
уже пробовал скорость передачи менять ...
Вложения
5909523.png
6764845.png
Последний раз редактировалось alex2485as 15.05.2016{, 01:34}, всего редактировалось 1 раз.

NightScream
Рядовой
Сообщения: 21
Зарегистрирован: 29.02.2016{, 10:58}
Репутация: 0
Откуда: Краснодар

ардуино + ДЕЛФИ

#5

Сообщение NightScream » 15.05.2016{, 21:24}

Я в своё время писал на Delphi 7 программы для работы с com портом и использовал bcomport компонент, очень лёгок в использовании, рекомендую.
Еще раз скажу, что ВСЕ данные в сети передаются байтами и склеивать их в другие типы вам надо самостоятельно.
Если завтра найдется минутка, то набросаю программку на делфи.

alex2485as
Рядовой
Сообщения: 8
Зарегистрирован: 27.12.2015{, 15:25}
Репутация: 1
Откуда: Армавир

ардуино + ДЕЛФИ

#6

Сообщение alex2485as » 15.05.2016{, 22:22}

Буду ооочень благодарен завтра или хоть через месяц мне не к спеху , моего клиента уже давно видимо перехватили более продвинутые электронщики, это уже чисто принципиальный вопрос и никакой материальной выгоды лишь только моральное удовлетворение-))))....я просто не особо хорошо ориентируюсь в делфи и думал , что достаточно просто указать формат переменных, ..С массивами все понятно как их создавать как их передовать в порт в FLProg, но вот вопрос как их принять в делфи  в правильном порядке байт за байтом - массив скажем так , потом их по вашей формуле склеить обратно и поместить в переменную типа REAL?///
Кстати обратил внимание если отправлять integer в UART  похоже там уже разбивается на части на 4 байта .Надо в делфи разобраться и правильно эту посылку принять.
Я сам буду экспериментировать в делфи и пробовать ...Но хотелось бы увидеть как это делают те кто умеет это делать посмотреть на скелет программы и пробовать разобраться...
Последний раз редактировалось alex2485as 16.05.2016{, 18:06}, всего редактировалось 1 раз.

NightScream
Рядовой
Сообщения: 21
Зарегистрирован: 29.02.2016{, 10:58}
Репутация: 0
Откуда: Краснодар

ардуино + ДЕЛФИ

#7

Сообщение NightScream » 16.05.2016{, 22:10}

Открывал делфи, пробовал писать, времени не хватило чтобы закончить мысль, обед маленький))
Ну могу сказать что если вы передаёте просто число, не важно какое, то оно передается в кодировке ascii
Чтобы его перевести в цифру надо использовать функцию chr() в делфи
В flprog передаете любое число и ставьте галочку отправлять перевод каретки
В делфи складывайте все байты которые пришли до тех пор пока не встретите перевод каретки (13 10)
После их встречи воспользуйтесь функцией chr()
Вот собственно и всё.

alex2485as
Рядовой
Сообщения: 8
Зарегистрирован: 27.12.2015{, 15:25}
Репутация: 1
Откуда: Армавир

ардуино + ДЕЛФИ

#8

Сообщение alex2485as » 19.05.2016{, 00:33}

В общем, кое  что получилось ....Выкладываю может кому пригодится для экспериментов.
Выбираем ком порт нажимаем подсоединить.У меня COM 2.
В левых ячейках отображаются значения на аналоговых входах. Для каждого аналогового входа предусмотрен множитель - например ставим множитель 0,02 и нажимаем ОК - правее будут измеренные значения - например в виде напряжения. Только множитель нужно вводить через запятую, а не через точку!!! ТО ЕСТЬ не 0.02 а нужно вводить 0,02
Вложения
FLP_COMport.rar
(196.41 КБ) 60 скачиваний
COMport.rar
(935.18 КБ) 48 скачиваний
Последний раз редактировалось alex2485as 19.05.2016{, 19:26}, всего редактировалось 1 раз.

Ответить

Вернуться в «Спросить у знатоков»