ардуино + ДЕЛФИ
-
- Рядовой
- Сообщения: 8
- Зарегистрирован: 27 дек 2015, 15:25
- Откуда: Армавир
ардуино + ДЕЛФИ
Всем привет , НУЖНА ПОМОЩЬ .
Задача такая;
нужен обмен данными ардуино с компъютером через Com порт.
мне нужно измерить вес в граммах с помощью тензодатчика и передать значение на компьютер через com порт , тот же UART и соответственно тот же USB порт который есть на ардуине. В делфи написана программа, которая соединяется с ардуинкой и можно наблюдать эти самые данные веса. Тут же кнопки управления включением и выключением пинов на ардуине.
Я экспериментировал на Ардуино Nano ATmega328.
flpor 1.10.3
Delphi 7
Начал эксперименты свои просто с передачи данных по USB собственно через который программируется сам ардуино .
Выкладываю свои результаты .
Все работает если обмен производить 8-ми разрядными регистрами тобишь формат слова в ардуине - byte , а в делфи -Word.
я выложил как раз рабочую версию.
Проблемы начинаются когда я пытаюсь передать данные из ардуино на компьютер число любого другого формата, мне нужно передавать число с плавающей запятой то есть формат слова - Float -на ардуине , а в делфи cкорее всего REAL.
В общем я пробовал все форматы Integer, float. ну все которые там вообще есть=-)))....в итоге ниче не получилось...
Если кто нибудь имеет опыт работы с Делфи может сможете помоч...откорректировать мою программу так чтобы с ардуино на компьютер передать число с плавающей запятой...либо хотя бы в формате INTEGER......Заранее спасибо....
Задача такая;
нужен обмен данными ардуино с компъютером через Com порт.
мне нужно измерить вес в граммах с помощью тензодатчика и передать значение на компьютер через com порт , тот же UART и соответственно тот же USB порт который есть на ардуине. В делфи написана программа, которая соединяется с ардуинкой и можно наблюдать эти самые данные веса. Тут же кнопки управления включением и выключением пинов на ардуине.
Я экспериментировал на Ардуино Nano ATmega328.
flpor 1.10.3
Delphi 7
Начал эксперименты свои просто с передачи данных по USB собственно через который программируется сам ардуино .
Выкладываю свои результаты .
Все работает если обмен производить 8-ми разрядными регистрами тобишь формат слова в ардуине - byte , а в делфи -Word.
я выложил как раз рабочую версию.
Проблемы начинаются когда я пытаюсь передать данные из ардуино на компьютер число любого другого формата, мне нужно передавать число с плавающей запятой то есть формат слова - Float -на ардуине , а в делфи cкорее всего REAL.
В общем я пробовал все форматы Integer, float. ну все которые там вообще есть=-)))....в итоге ниче не получилось...
Если кто нибудь имеет опыт работы с Делфи может сможете помоч...откорректировать мою программу так чтобы с ардуино на компьютер передать число с плавающей запятой...либо хотя бы в формате INTEGER......Заранее спасибо....
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось alex2485as 14 май 2016, 15:50, всего редактировалось 1 раз.
-
- Рядовой
- Сообщения: 21
- Зарегистрирован: 29 фев 2016, 10:58
- Откуда: Краснодар
ардуино + ДЕЛФИ
Скачивать ничего не хочется, лучше б показали что отправляли и массив который приходит.
Не понятно это
Всё передается БАЙТАМИ и преобразовывать в любой другой формат будете сами
НАПРИМЕР
передаёте ИЗ ардуино 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 модулями, но интересно как оно обстоит у ардуино, для некоммерческого учета может что-нибудь и соберу, заранее спасибо.
Не понятно это
что именно не получилось???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 май 2016, 22:45, всего редактировалось 1 раз.
-
- Рядовой
- Сообщения: 8
- Зарегистрирован: 27 дек 2015, 15:25
- Откуда: Армавир
ардуино + ДЕЛФИ
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 в библиотеке этот блок еще не создан-))))...А хотелось быыы..
А пока что придется пробовать вот к примеру по такой схеме и подать на аналоговый вход ардуино...
вот переменные в делфи и настройки ком порта
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 в библиотеке этот блок еще не создан-))))...А хотелось быыы..
А пока что придется пробовать вот к примеру по такой схеме и подать на аналоговый вход ардуино...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось alex2485as 15 май 2016, 01:23, всего редактировалось 1 раз.
-
- Рядовой
- Сообщения: 8
- Зарегистрирован: 27 дек 2015, 15:25
- Откуда: Армавир
ардуино + ДЕЛФИ
если 8 разрядное слово передаю формат byte то отпровляемые данные от 0-до 255 соответствуют принятым на компе...
Когда же ставлю в FLP формат слова integer условно и переменная в делфи тоже integer то при отправке с ардуино числа 1000 на компе я вижу значения какие то непонятные , то 24, то 124 , только не 1000......
уже пробовал скорость передачи менять ...
Когда же ставлю в FLP формат слова integer условно и переменная в делфи тоже integer то при отправке с ардуино числа 1000 на компе я вижу значения какие то непонятные , то 24, то 124 , только не 1000......
уже пробовал скорость передачи менять ...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось alex2485as 15 май 2016, 01:34, всего редактировалось 1 раз.
-
- Рядовой
- Сообщения: 21
- Зарегистрирован: 29 фев 2016, 10:58
- Откуда: Краснодар
ардуино + ДЕЛФИ
Я в своё время писал на Delphi 7 программы для работы с com портом и использовал bcomport компонент, очень лёгок в использовании, рекомендую.
Еще раз скажу, что ВСЕ данные в сети передаются байтами и склеивать их в другие типы вам надо самостоятельно.
Если завтра найдется минутка, то набросаю программку на делфи.
Еще раз скажу, что ВСЕ данные в сети передаются байтами и склеивать их в другие типы вам надо самостоятельно.
Если завтра найдется минутка, то набросаю программку на делфи.
-
- Рядовой
- Сообщения: 8
- Зарегистрирован: 27 дек 2015, 15:25
- Откуда: Армавир
ардуино + ДЕЛФИ
Буду ооочень благодарен завтра или хоть через месяц мне не к спеху , моего клиента уже давно видимо перехватили более продвинутые электронщики, это уже чисто принципиальный вопрос и никакой материальной выгоды лишь только моральное удовлетворение-))))....я просто не особо хорошо ориентируюсь в делфи и думал , что достаточно просто указать формат переменных, ..С массивами все понятно как их создавать как их передовать в порт в FLProg, но вот вопрос как их принять в делфи в правильном порядке байт за байтом - массив скажем так , потом их по вашей формуле склеить обратно и поместить в переменную типа REAL?///
Кстати обратил внимание если отправлять integer в UART похоже там уже разбивается на части на 4 байта .Надо в делфи разобраться и правильно эту посылку принять.
Я сам буду экспериментировать в делфи и пробовать ...Но хотелось бы увидеть как это делают те кто умеет это делать посмотреть на скелет программы и пробовать разобраться...
Кстати обратил внимание если отправлять integer в UART похоже там уже разбивается на части на 4 байта .Надо в делфи разобраться и правильно эту посылку принять.
Я сам буду экспериментировать в делфи и пробовать ...Но хотелось бы увидеть как это делают те кто умеет это делать посмотреть на скелет программы и пробовать разобраться...
Последний раз редактировалось alex2485as 16 май 2016, 18:06, всего редактировалось 1 раз.
-
- Рядовой
- Сообщения: 21
- Зарегистрирован: 29 фев 2016, 10:58
- Откуда: Краснодар
ардуино + ДЕЛФИ
Открывал делфи, пробовал писать, времени не хватило чтобы закончить мысль, обед маленький))
Ну могу сказать что если вы передаёте просто число, не важно какое, то оно передается в кодировке ascii
Чтобы его перевести в цифру надо использовать функцию chr() в делфи
В flprog передаете любое число и ставьте галочку отправлять перевод каретки
В делфи складывайте все байты которые пришли до тех пор пока не встретите перевод каретки (13 10)
После их встречи воспользуйтесь функцией chr()
Вот собственно и всё.
Ну могу сказать что если вы передаёте просто число, не важно какое, то оно передается в кодировке ascii
Чтобы его перевести в цифру надо использовать функцию chr() в делфи
В flprog передаете любое число и ставьте галочку отправлять перевод каретки
В делфи складывайте все байты которые пришли до тех пор пока не встретите перевод каретки (13 10)
После их встречи воспользуйтесь функцией chr()
Вот собственно и всё.
-
- Рядовой
- Сообщения: 8
- Зарегистрирован: 27 дек 2015, 15:25
- Откуда: Армавир
ардуино + ДЕЛФИ
В общем, кое что получилось ....Выкладываю может кому пригодится для экспериментов.
Выбираем ком порт нажимаем подсоединить.У меня COM 2.
В левых ячейках отображаются значения на аналоговых входах. Для каждого аналогового входа предусмотрен множитель - например ставим множитель 0,02 и нажимаем ОК - правее будут измеренные значения - например в виде напряжения. Только множитель нужно вводить через запятую, а не через точку!!! ТО ЕСТЬ не 0.02 а нужно вводить 0,02
Выбираем ком порт нажимаем подсоединить.У меня COM 2.
В левых ячейках отображаются значения на аналоговых входах. Для каждого аналогового входа предусмотрен множитель - например ставим множитель 0,02 и нажимаем ОК - правее будут измеренные значения - например в виде напряжения. Только множитель нужно вводить через запятую, а не через точку!!! ТО ЕСТЬ не 0.02 а нужно вводить 0,02
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось alex2485as 19 май 2016, 19:26, всего редактировалось 1 раз.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя