FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Суббота, 03.12.2016, 07:40
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » ардуино + ДЕЛФИ (соединение компьютера с ардуино по UART)
ардуино + ДЕЛФИ
alex2485as
Дата: Суббота, 14.05.2016, 15:48 | Сообщение # 1
Рядовой
Группа: Проверенные
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
Всем привет , НУЖНА ПОМОЩЬ  .
Задача такая;
нужен обмен данными ардуино с компъютером через Com порт.
мне нужно измерить вес в граммах с помощью тензодатчика и передать значение на компьютер через com порт , тот же UART и соответственно тот же USB порт который есть на ардуине. В делфи написана программа, которая соединяется с ардуинкой и можно наблюдать эти самые данные веса. Тут же кнопки управления включением и выключением пинов на ардуине.
Я экспериментировал на Ардуино Nano ATmega328.
flpor 1.10.3
Delphi 7
Начал эксперименты свои просто с передачи данных по USB собственно через который программируется сам ардуино .
Выкладываю свои результаты .
Все работает если обмен производить 8-ми разрядными регистрами тобишь формат слова в ардуине - byte    , а       в делфи -Word.
я выложил как раз рабочую версию.
Проблемы начинаются когда я пытаюсь передать данные из ардуино на компьютер число любого другого формата, мне нужно передавать число с плавающей запятой то есть формат слова - Float -на ардуине     , а в делфи     cкорее всего REAL.
В общем я пробовал все форматы Integer, float. ну все которые там вообще есть=-)))....в итоге ниче не получилось...
Если кто нибудь имеет опыт работы с Делфи может сможете помоч...откорректировать мою программу так чтобы с ардуино на компьютер передать число с плавающей запятой...либо хотя бы в формате INTEGER......Заранее спасибо....
Прикрепления: eksperiment.rar(1075Kb)


Сообщение отредактировал alex2485as - Суббота, 14.05.2016, 15:50
 
NightScream Дата: Суббота, 14.05.2016, 22:37 | Сообщение # 2
Рядовой
Группа: Проверенные
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Скачивать ничего не хочется, лучше б показали что отправляли и массив который приходит.
Не понятно это
Цитата 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
 
alex2485as Дата: Воскресенье, 15.05.2016, 00:52 | Сообщение # 3
Рядовой
Группа: Проверенные
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
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(4Kb)


Сообщение отредактировал alex2485as - Воскресенье, 15.05.2016, 01:23
 
alex2485as Дата: Воскресенье, 15.05.2016, 01:25 | Сообщение # 4
Рядовой
Группа: Проверенные
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
если 8 разрядное слово передаю формат byte то отпровляемые данные от 0-до 255 соответствуют принятым на компе...
Когда же ставлю в FLP формат слова integer условно и переменная в делфи тоже integer то при отправке с ардуино числа 1000 на компе я вижу значения какие то непонятные , то 24, то 124 , только не 1000......
уже пробовал скорость передачи менять ...
Прикрепления: 6764845.png(54Kb) · 5909523.png(31Kb)


Сообщение отредактировал alex2485as - Воскресенье, 15.05.2016, 01:34
 
NightScream Дата: Воскресенье, 15.05.2016, 21:24 | Сообщение # 5
Рядовой
Группа: Проверенные
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Я в своё время писал на Delphi 7 программы для работы с com портом и использовал bcomport компонент, очень лёгок в использовании, рекомендую.
Еще раз скажу, что ВСЕ данные в сети передаются байтами и склеивать их в другие типы вам надо самостоятельно.
Если завтра найдется минутка, то набросаю программку на делфи.
 
alex2485as Дата: Воскресенье, 15.05.2016, 22:22 | Сообщение # 6
Рядовой
Группа: Проверенные
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
Буду ооочень благодарен завтра или хоть через месяц мне не к спеху , моего клиента уже давно видимо перехватили более продвинутые электронщики, это уже чисто принципиальный вопрос и никакой материальной выгоды лишь только моральное удовлетворение-))))....я просто не особо хорошо ориентируюсь в делфи и думал , что достаточно просто указать формат переменных, ..С массивами все понятно как их создавать как их передовать в порт в FLProg, но вот вопрос как их принять в делфи  в правильном порядке байт за байтом - массив скажем так , потом их по вашей формуле склеить обратно и поместить в переменную типа REAL?///
Кстати обратил внимание если отправлять integer в UART  похоже там уже разбивается на части на 4 байта .Надо в делфи разобраться и правильно эту посылку принять.
Я сам буду экспериментировать в делфи и пробовать ...Но хотелось бы увидеть как это делают те кто умеет это делать посмотреть на скелет программы и пробовать разобраться...


Сообщение отредактировал alex2485as - Понедельник, 16.05.2016, 18:06
 
NightScream Дата: Понедельник, 16.05.2016, 22:10 | Сообщение # 7
Рядовой
Группа: Проверенные
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Открывал делфи, пробовал писать, времени не хватило чтобы закончить мысль, обед маленький))
Ну могу сказать что если вы передаёте просто число, не важно какое, то оно передается в кодировке ascii
Чтобы его перевести в цифру надо использовать функцию chr() в делфи
В flprog передаете любое число и ставьте галочку отправлять перевод каретки
В делфи складывайте все байты которые пришли до тех пор пока не встретите перевод каретки (13 10)
После их встречи воспользуйтесь функцией chr()
Вот собственно и всё.
 
alex2485as Дата: Четверг, 19.05.2016, 00:33 | Сообщение # 8
Рядовой
Группа: Проверенные
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
В общем, кое  что получилось ....Выкладываю может кому пригодится для экспериментов.
Выбираем ком порт нажимаем подсоединить.У меня COM 2.
В левых ячейках отображаются значения на аналоговых входах. Для каждого аналогового входа предусмотрен множитель - например ставим множитель 0,02 и нажимаем ОК - правее будут измеренные значения - например в виде напряжения. Только множитель нужно вводить через запятую, а не через точку!!! ТО ЕСТЬ не 0.02 а нужно вводить 0,02
Прикрепления: COMport.rar(935Kb) · FLP_COMport.rar(196Kb)


Сообщение отредактировал alex2485as - Четверг, 19.05.2016, 19:26
 
Форум » Основной » Спросить у знатоков » ардуино + ДЕЛФИ (соединение компьютера с ардуино по UART)
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика