Управление изображением на мониторе через COM порт

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

img1.top это Y координата верхнего угла картинки относительно верхнего угла формы. ей можно писвоить новое значение. перемещает картинку.
img2.top.Draw(60,x,lift) : такого не бывает.
img2.canvas.Draw - метод(рисует картинку).
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

img1.top это Y координата верхнего угла картинки относительно верхнего угла формы. ей можно писвоить новое значение.
а как это в программе сделать?И почему движения нет -все какбы запускается компилируется, отображается?
(\_(\
(=' :') радиоКотЭ
(,('')('')
Реклама
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

шлите листинг с картинками. буду разбираться.
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

может проще исходник запилить? вот картинки
ниже полный листинг,может все таки проще АVI применить или нет?

Код: Выделить всё


unit Unit1;

interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  ExtCtrls;



type

  TForm1 = class(TForm)
    img1: TImage;
    img2: TImage;
    tmr1: TTimer;

    procedure FormCreate(Sender: TObject);
    procedure Tmr1Timer(Sender: TObject);
  

  private

    { Private declarations }

  public

    { Public declarations }

  end;

//Описание типов переменных

var

  Form1: TForm1;

  Dom:tbitmap;//ГРАФИЧЕСКИЙ ОБРАЗ дома

  lift:TBITMAP;//ГРАФИЧЕСКИЙ ОБРАЗ лифта

  y:integer;//координаты y лифта

  shx:integer;//Шаг движения лифта  по y
  



implementation



{$R *.DFM}



//Старт главной формы

procedure TForm1.FormCreate(Sender: TObject);

begin

shx:=6;

//

Dom:=tbitmap.Create;//

lift:=tbitmap.Create;//

//
Dom.LoadFromFile('Dom.bmp');//Загрузить в переменную 'Dom' файл  'Dom.bmp'

//

lift.LoadFromFile('lift.bmp');//Загрузить в переменную 'lift' файл  'lift.bmp'
//

img1.canvas.Draw(0,0,Dom);//

img2.canvas.Draw(60,0,lift);//

end;


//Работа таймера движение лифта

procedure TForm1.tmr1Timer(Sender: TObject);
begin
   y:=y+shx;//текущая координата + шаг

if y>500 then shx:=shx*-1;// ограничение справа

if y<0 then shx:=shx*-1;//ограничение слева

img1.canvas.Draw(0,0,Dom);//возобновление фона

img2.canvas.Draw(60,0,lift);//движение корабля

end;

end.

(\_(\
(=' :') радиоКотЭ
(,('')('')
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

у вас картинка не двигается, потому, что координата её не меняется при работе таймера
у вас:
img2.canvas.Draw(60,0,lift);//
а должно быть
img2.canvas.Draw(60,y,lift);//
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

эффекта не произвело,там раньше стоял х потом я поставил 0,сейчас стоит y
(\_(\
(=' :') радиоКотЭ
(,('')('')
Реклама
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

Ваш лифт должен быть меньше его рамки рисунка(т.е двигается он только в пределах рамки.) у меня двигается.
похоже, что его нельзя растягивать на всю рамку. поставив точку останова внутри события таймера можно пошагово посмотреть, что происходит.
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

поставив точку останова внутри события таймера
я помню что вы говорили, а вот как уже забыл, и не смог найти в теме, и это же касамоемо пошагового воспроизведения программы,так все и стоит лифт я выставил по центру как опустить в нижнюю часть рамки незнаю.Попробовал AVI воспроизводится чудесно только есть задержка воспроизведения в несколько секунд после компиляции и не получилось растащить его по рамке ,свойства стрейтч там нет(( может какое другое есть?и с какой скоростью двигается? я поставил время таймера 1000 --это должна быть секунда т.е. незримо для глаза он не должен проскочить
(\_(\
(=' :') радиоКотЭ
(,('')('')
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

в окне программного кода скомпилированной и запущенной программы, слева, есть полоска с синими точками, если в точку кликнуть, точка станет большой и красной. это и есть точка останова. дальше - как в паскале: красная полоса, F7 -по шагам с заходом в процедуры -F8 - без, F9 - до следующей точки останова.
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

прошел пошагово до таймера и погонял в таймере -- не было никаких изменений
(\_(\
(=' :') радиоКотЭ
(,('')('')
Друг Кота
Сообщения: 6282
Зарегистрирован: Чт май 13, 2010 23:42:03
Откуда: Минск

Сообщение Murlock »

рамка картинки лифта должна быть как шахта, высокая и узкая. а как у Вас?
" Если на небе есть ангелы, то, их небесное воинство построено на принципах мафии"
У.Н. Румфорд.
----------------------------------------
http://www.youtube.com/watch?v=qWfIYU9Zzs4 А.К. "Легион"
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Высокая и узкая,лифт висит посередине
\\и я кажется понял как вы предлагали управлять картинкой свойством top

Код: Выделить всё

вот так . только проблемма в чем он не плавно перемещается ,а с 1 го этажа скачком выше 3 го и потом до упора в границу окна программы ,время таймера влияет только на время между этими скачками, shx менял ставил вплоть до 1 --эффекта по моему вообще нет

procedure TForm1.tmr1Timer(Sender: TObject);
begin
img2.top:=y+shx;//òåêóùàÿ êîîðäèíàòà + øàã

if y>500 then shx:=shx*-1;// îãðàíè÷åíèå ñïðàâà

if y<0 then shx:=shx*-1;//îãðàíè÷åíèå ñëåâà

img1.canvas.Draw(0,0,Dom);//âîçîáíîâëåíèå ôîíà

img2.canvas.Draw(60,0,lift);//äâèæåíèå êîðàáëÿ

end;



выпилил почти все то что мне казалось ненужным
время таймера это время между скачками.пробовал поставить дробное значение щага , не прокатило

unit Unit1;

interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls;



type

TForm1 = class(TForm)
img1: TImage;
img2: TImage;
tmr1: TTimer;

procedure FormCreate(Sender: TObject);
procedure Tmr1Timer(Sender: TObject);


private

{ Private declarations }

public

{ Public declarations }

end;

//Îïèñàíèå òèïîâ ïåðåìåííûõ

var

Form1: TForm1;

Dom:tbitmap;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ äîìà

lift:TBITMAP;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ ëèôòà

implementation



{$R *.DFM}



//Ñòàðò ãëàâíîé ôîðìû

procedure TForm1.FormCreate(Sender: TObject);

begin
Dom:=tbitmap.Create;//

lift:=tbitmap.Create;//

//
Dom.LoadFromFile('Dom.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'Dom' ôàéë 'Dom.bmp'

//

lift.LoadFromFile('lift.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'lift' ôàéë 'lift.bmp'

end;


//Ðàáîòà òàéìåðà äâèæåíèå ëèôòà

procedure TForm1.tmr1Timer(Sender: TObject);
begin
img2.top:=+1;//òåêóùàÿ êîîðäèíàòà + øàã
end;

end.
(\_(\
(=' :') радиоКотЭ
(,('')('')
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

У нас с мурлоком встало дело,порт как будто не опрашивается, условие if b=32 then tmr2.Enabled:=True; не выполняется,да и остальные процедуры как -то не работают --например обнуление порта data:=0;
outport(port,data); даже после закрытия на RTS все равно 1 ,она там постоянно присутствует(

может быть кто узреет ошибку?

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, giveio;

type
  TForm1 = class(TForm)
    tmr1: TTimer;
    img1: TImage;
    img2: TImage;
    tmr2: TTimer;
    tmr3: TTimer;
    tmr4: TTimer;
    tmr5: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Tmr1Timer(Sender: TObject);
    procedure tmr2Timer(Sender: TObject);
    procedure tmr3Timer(Sender: TObject);
    procedure tmr4Timer(Sender: TObject);
    procedure tmr5Timer(Sender: TObject);
    
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

var
a,b,c:word;
port,base,data:word;
Dom:tbitmap;//ГРАФИЧЕСКИЙ ОБРАЗ дома
lift:TBITMAP;//ГРАФИЧЕСКИЙ ОБРАЗ лифта


procedure TForm1.FormCreate(Sender: TObject);
Begin
base:=$3F8;
InitDriver;

Dom:=tbitmap.Create;//

lift:=tbitmap.Create;//

Dom.LoadFromFile('Dom.bmp');//Загрузить в переменную 'Dom' файл  'Dom.bmp'
//
lift.LoadFromFile('lift.bmp');//Загрузить в переменную 'lift' файл  'lift.bmp'
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
port:=base+4;
data:=2;
outport(port,data);
sleep(10);
port:=base+6;
a:=inport(port) and 128;// 3 этаж  1 вывод COM порта  DCD
port:=base+6;
b:=inport(port) and 32; // 2 этаж 6 вывод порта DSR
port:=base+6;
c:=inport(port) and 16;//1этаж 8 вывод  порта CTS
if b=32 then tmr2.Enabled:=True;
data:=0;
outport(port,data);{aio  yoi eae iia ea?aony eeoiaa}
end;

//Работа таймера движение лифта


procedure TForm1.tmr2Timer(Sender: TObject);

begin
img2.top:=img2.top-13;//подъем на 2
if img2.top<442 then tmr2.Enabled:=False;
end;
(\_(\
(=' :') радиоКотЭ
(,('')('')
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Лифт кстати все таки поехал,но не на дельфи ,а на визуал бейсике- у него еть компонент MSCOMM32.OCX который как раз позволяет рулить отдельными выводами порта.Если кому-то впоследствии понадобится то вот статья об этом http://schemz.narod.ru/COMdevice.htm
(\_(\
(=' :') радиоКотЭ
(,('')('')
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

FRIM@N писал(а):ну дык может есть что-то попроще и посовременней? я упомянул VB как так считал всегда что он простой,а Com порты еще используются? и что было раньше COM или LPT ?
Есть по современней - PureBasic.
Он работает с COM портом без внешних компонентов.
Вот функции для доступа к COM порту http://purebasic.ru/manual.php?id=1148&lng=rus
рулить отдельными выводами порта.
В PureBasic за это отвечаю функции GetSerialPortStatus и SetSerialPortStatus

PS.
Кстати, в отличие от VB, PureBasic позволяет работать с COM портом не только в Windows, но и в Linux и MacOS X.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

FRIM@N писал(а):рулить отдельными выводами порта
В дельфи можно воспользоваться стандартной функцией EscapeCommFunction (управляет DTR и RTS)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

я спаял таки саму схему и возникли проблеммы полез поглядеть и чудо чудное - на выводах RTS и DTR по -12 вольт до запуска программы после запуска становится по +12 то есть по "0" хотя в прогрмме прописано что выводы выставляются в 1, если замкнуть (пинцетом так как кнопки не доступны,об этом ниже) нужный вывод то лифт движется несмотря на то что на выводе 0 а ехать он должен при 1,после выволнения цикла DTR выставляется в 0 в программе реально все наоборот на выводе -12 В.Грубо говоря получается инверсия 1 и 0 которую я не вызывал -- что это такое и как может быть?а кнопки не могут работать потому что я с платы подаю -12 вольт т.е. единицу на общий вывод кнопок.

исходник

Engineer_Keen и Мурик спасибо но вы немного подзапоздали

с симуляций слежения за лифтом я разобрался -худо-бедно,подключил вывод 5 МАХ 238 через 5кОм на землю,т.е. дал на кнопки "0" и он поехал но это все по меньшей мере странно т.к. ехать должен при присутствии 1 на входах.не получится так что на другой машине все будет так как должно и схема откажется работать?
Перейдем ко второму акту,а именно к регистру сдвига при отдаче команды с компьютера -- загораются все светодиоды разом независимо от того какие хотел зажечь я и впоследствии это не сбрасывается,наверное из-за странной инверсии.

И еще при включении устройства сразу загораются все светодиоды,я думал это дребезг контактов т.к. иногда загораются не все,и при запуске подпрограммы которая должна зажигать нужные светодиоды они зажигаются все я попробовол сбросить "вручную" подав +5 в на 10 вывод регистра -- он не сбросился,неисправен регистр? и пробовал посмотреть изменения выводов RTS и DTR при зажигании ни один не меняеется ,но светодиоды загораются в момент нажатия кнопки в программе т.е. как то управление идет, или просто я не успеваю заметить изменения с 0 на 1 и обратно?
Вложения
2011-04-06_223252.jpg
схема
(37.28 КБ) 510 скачиваний
(\_(\
(=' :') радиоКотЭ
(,('')('')
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Эге, я все пропустил. А зачем сию схемку собрали? Какую функцию она выполняет?

Кстати, после КРЕНки хорошо бы кондей иметь, а то можно огрести генерацию регулятора.

Ишшо надо бы даташит на 238-й глянуть, я с ним никогда не работал.
Знание - сила!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2409
Зарегистрирован: Ср дек 03, 2008 21:00:19

Сообщение FRIM@N »

Эге, я все пропустил. А зачем сию схемку собрали? Какую функцию она выполняет?
Ничего не пропустили я,о ней в этой теме не говорил эта схема= позаимствована здесь только чуть изменена,с ее помощью я хотел управлять реальным лифтом через якобы оптроны,на самом деле просто светодиоды для наглядности.

даташит на мах 238там вся линейка,238 находится на 25 странице
конденсатор поставлю сейчас
Вложения
74HC_HCT595_CNV_3.pdf
даташит на регистр сдвига
(99.62 КБ) 388 скачиваний
2011-04-08_124137.jpg
МАХ 238
(65.53 КБ) 471 скачивание
2011-04-08_123924.jpg
скриншот программы
(27.36 КБ) 472 скачивания
(\_(\
(=' :') радиоКотЭ
(,('')('')
Модератор
Аватара пользователя
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Ага, с 238-м понятно - от старого доброго 211-го отличается мелочами, значит работать должен так же, то есть правильно должен работать.

Касательно порта. Вы учли, что биты RTS и DTR инвертируются в 550-м контроллере? Т.е. почти наверняка инвертируются и у вас в порту. Так что запись единицы в соответствующий бит приводит к появлению нуля на выходе порта, а ноль подается плюсом.

По поводу сброса шифтика - ну написано же в даташите, что он ресетится нулем. Зачем было 5В присовывать? :)

По поводу загорания светиков ("иногда не всех") - у вас разрешение буфера в шифтике сидит на нуле перманентно. Т.е. на выход сразу идет содержимое регистра хранения. А там после подачи питания теоретически может быть что угодно (там ведь триггеры), если только нет автоматического сброса. Но я уверен, что его нет.

Почему у вас загораются не те светодиоды - не представляю пока. Вы не могли бы как-то изложить суть алгоритма, чтобы мне не вникать в гнусный бейсик?
Знание - сила!
Ответить

Вернуться в «Интеграция с ПК»