киньте в личку куда и как платить. По б/н переведу сразу же без проблем.
Вид для печати
киньте в личку куда и как платить. По б/н переведу сразу же без проблем.
Микросхемы у меня на руках так что могу уже раздавать.ъ
2MiD_E34 С Ashu скооперируйтесь вы оба из Питера
Ну так решили как вам лучше отправлять?
сцылко
Интересно, а можно ли реализовать приборку на базе arduino ну или в крайнем случае Seeeduino(на базе ATmega1280) без участия компа:)
Можно, я даже скетч работы с тачем выкладывал
Хм.. что может быть, почему экран то дергается?..:(
Причем дергается когда двигается кубик, когда он останавливается показывает норм (видно на видео)
P.S. Сори за качество
Срыв кадровой синхры, скорее всего резистор не тот поставил
ну да.. ненашел 900ом поставил 910, так и думал что из за этого..:o
Спс, буду искать нужный :)
P.S. тестером на нем 920. Суровы отечественные резисторы.. :)
P.S.S. Из двуз сделал 1 получилось 901 Ом но всеравно скачит :(
900 или 920 разницы особой нет :)
Возможно ты залил скетчь написаный для NTSC, а не для PAL
скетч вот этот
P.S. Блин, точн для ntsc :)) все разобался, ушел в тругую комнату на нормальный телек, там все норм :) спсКод://Arduino Tv framebuffer
//Alastair Parker
//2007
// Video out voltage levels
#define _SYNC 0x00
#define _BLACK 0x01
#define _GRAY 0x02
#define _WHITE 0x03
// dimensions of the screen
#define WIDTH 38
#define HEIGHT 14
//number of lines to display
#define DISPLAY_LINES 240
// update speed for the main loop of the game
#define UPDATE_INTERVAL 1
// positions of the player paddles
#define PLAYER_RIGHT_X 35
#define PLAYER_LEFT_X 2
// maximum velocity of the ball
#define MAX_VEL 10
// locations of the top and bottom virtual bars
#define SCORE_BAR 3
#define BASE_BAR 13
// time to wait while paused
#define DONE_WAITING 30
#define SCORE_WAITING 30
// max player life
#define MAX_LIFE 6
//positions of player life bars
#define PLAYER_LEFT_LIFE 2
#define PLAYER_RIGHT_LIFE 23
// input pins for the player pots
#define PLAYER_LEFT_PIN 2
// currently the same pin
#define PLAYER_RIGHT_PIN 3
//video pins
#define DATA_PIN 9
#define SYNC_PIN 8
// the video frameBuffer
byte frameBuffer[WIDTH][HEIGHT];
// loop indices
byte index, index2;
// pal video line loop
byte line;
// current drawing line in framebuffer
byte newLine;
// flag used in wait loop to indicate that player just scored
boolean justScored=false;
// positions for the left paddle
byte playerLeft;
byte playerLeftOld=-1;
// life for the left player
byte playerLeftLife = MAX_LIFE;
// positions of the right paddle
byte playerRight;
byte playerRightOld=-1;
// life for the right player
byte playerRightLife = MAX_LIFE;
// positions and velocity of the ball
int ballXVel = -1;
int ballYVel = -5;
byte ballXPos = 14;
byte ballYPos = 7;
// loop counters to control the velocity of the ball
byte ballXLoop =MAX_VEL;
byte ballYLoop =MAX_VEL;
// loop counter to for the main loop delay
int waitingCount = 0;
// start postion of the loading bar
byte loadingBar = 2;
// if the left player should be updated or the right
boolean playerLeftTurn=true;
// if we should be waiting for something to happen
boolean waiting=true;
// if displaying the title
boolean showingTitle = true;
// value of the counter controlling the freq of updates
byte updateCounter=0;
// init the variables
void initGame()
{
playerLeftOld=-1;
playerLeftLife = MAX_LIFE;
playerRightOld=-1;
playerRightLife = MAX_LIFE;
ballXVel = -1;
ballYVel = -5;
ballXPos = 14;
ballYPos = 7;
ballXLoop =MAX_VEL;
ballYLoop =MAX_VEL;
waitingCount = 0;
loadingBar = 2;
playerLeftTurn=true;
waiting=true;
showingTitle = true;
justScored=false;
updateCounter=0;
}
// draw a pixel to the buffer
void setPixel(byte x,byte y)
{
frameBuffer[x][y]= _WHITE;
}
void grayPixel(byte x, byte y)
{
frameBuffer[x][y]= _GRAY;
}
// draw a black pixel to the buffer
void clearPixel(byte x,byte y)
{
frameBuffer[x][y]= _BLACK;
}
// draw a paddle
void drawPaddle(byte x,byte y,byte col)
{
frameBuffer[x][y]= col;
frameBuffer[x][y+1]= col;
}
//draw the title message
void drawArduinoPong()
{
//arduino
setPixel(7,3);
setPixel(8,3);
setPixel(15,3);
setPixel(21,3);
setPixel(6,4);
setPixel(8,4);
setPixel(14,4);
setPixel(15,4);
setPixel(28,4);
setPixel(6,5);
setPixel(7,5);
setPixel(8,5);
setPixel(10,5);
setPixel(11,5);
setPixel(13,5);
setPixel(15,5);
setPixel(17,5);
setPixel(19,5);
setPixel(21,5);
setPixel(23,5);
setPixel(24,5);
setPixel(27,5);
setPixel(29,5);
setPixel(6,6);
setPixel(8,6);
setPixel(10,6);
setPixel(14,6);
setPixel(15,6);
setPixel(18,6);
setPixel(19,6);
setPixel(21,6);
setPixel(23,6);
setPixel(25,6);
setPixel(28,6);
//pong
setPixel(10,8);
setPixel(11,8);
setPixel(15,8);
setPixel(16,8);
setPixel(19,8);
setPixel(22,8);
setPixel(24,8);
setPixel(25,8);
setPixel(26,8);
setPixel(10,9);
setPixel(12,9);
setPixel(14,9);
setPixel(17,9);
setPixel(19,9);
setPixel(20,9);
setPixel(22,9);
setPixel(24,9);
setPixel(10,10);
setPixel(11,10);
setPixel(14,10);
setPixel(17,10);
setPixel(19,10);
setPixel(21,10);
setPixel(22,10);
setPixel(24,10);
setPixel(26,10);
setPixel(10,11);
setPixel(15,11);
setPixel(16,11);
setPixel(19,11);
setPixel(22,11);
setPixel(24,11);
setPixel(25,11);
setPixel(26,11);
}
// do the main game logic regarding the ball and collisions
void updateBall(boolean xEvent)
{
// if checking the x coords of the ball
if(xEvent)
{
/*
TODO
have the yvel start 1t 1
*/
//check for collision with left player
if(ballXPos <PLAYER_LEFT_X+2 & (playerLeft == ballYPos or playerLeft+1 == ballYPos))
{
ballXVel = -1 * ballXVel;
ballXPos=PLAYER_LEFT_X+1;
}
//check for collision with right player
if(ballXPos > PLAYER_RIGHT_X-2 & (playerRight == ballYPos or playerRight+1 == ballYPos))
{
ballXVel = -1 * ballXVel;
ballXPos=PLAYER_RIGHT_X-1;
}
//move the ball in the x direction
if(ballXVel < 1)
{
ballXPos--;
}
else
{
ballXPos++;
}
}
//if checking the y coords
if(!xEvent)
{
//check for top of screen hit
if( ballYPos <= SCORE_BAR )
{
ballYVel = -1 * ballYVel;
ballYPos = SCORE_BAR;
}
//check for bottom of screen hit
if( ballYPos>BASE_BAR )
{
ballYVel = -1 * ballYVel;
ballYPos = BASE_BAR+1;
}
// move the ball in the y direction
if(ballYVel < 1)
{
ballYPos--;
}
else
{
ballYPos++;
}
}
//always check for scoring of points
//right player scores
if(ballXPos==PLAYER_LEFT_X)//0
{
//reset the position of the ball
ballXPos = PLAYER_RIGHT_X - 5;
ballYPos=7;
// change the other players life
clearPixel(PLAYER_LEFT_LIFE+2*playerLeftLife-2,SCORE_BAR-1);
playerLeftLife--;
// indicate that someone scored so the wait doesn't start a new game
justScored=true;
// indicate that we should wait next loop
waiting=true;
// check if game is over
if(playerLeftLife==0)
justScored=false;
}
//left player scores
if(ballXPos==PLAYER_RIGHT_X)//38
{
//reset position of ball
ballXPos = PLAYER_LEFT_X + 5;
ballYPos=7;
//update other players score
clearPixel(PLAYER_RIGHT_LIFE+2*(MAX_LIFE-playerRightLife)+2,SCORE_BAR-1);
playerRightLife--;
// indicate that someone scored so the wain doesn't start a new game
justScored=true;
// indicate that we should wait next loop
waiting=true;
// check for game over
if(playerRightLife==0)
justScored=false;
}
}
// draw the player life bars
void initScreen()
{
for(index=1;index<=MAX_LIFE;++index)
{
grayPixel(index*2,SCORE_BAR-1);
grayPixel(index*2+PLAYER_RIGHT_LIFE,SCORE_BAR-1);
}
}
// draw the ball
void drawBall(byte col)
{
frameBuffer[ballXPos][ballYPos]=col;
}
// clear the screen
void clearScreen()
{
for (index = 0; index < WIDTH; index++)
for (index2=0;index2<=HEIGHT;++index2)
{
frameBuffer[index][index2] = _BLACK;
}
}
// the setup routine
void setup()
{
cli();
pinMode (SYNC_PIN, OUTPUT);
pinMode (DATA_PIN, OUTPUT);
digitalWrite (SYNC_PIN, HIGH);
digitalWrite (DATA_PIN, HIGH);
clearScreen();
drawArduinoPong();
}
void loop()
{
// iterate over the lines on the tv
for ( line =0;line< DISPLAY_LINES;++line)
{
// HSync
// front porch (1.5 us)
PORTB = _BLACK;
delayMicroseconds(1.5);
//sync (4.7 us)
PORTB = _SYNC;
delayMicroseconds(4.7);
// breezeway (.6us) + burst (2.5us) + colour back borch (1.6 us)
PORTB = _BLACK;
delayMicroseconds(0.6+2.5+1.6);
//calculate which line to draw to
newLine = line >>4;
delayMicroseconds(1);
//display the array for this line
// a loop would have been smaller, but it messes the timing up
PORTB = frameBuffer[0][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[1][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[2][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[3][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[4][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[5][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[6][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[7][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[8][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[9][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[10][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[11][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[12][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[13][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[14][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[15][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[16][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[17][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[18][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[19][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[20][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[21][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[22][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[23][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[24][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[25][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[26][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[27][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[28][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[29][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[30][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[31][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[32][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[33][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[34][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[35][newLine];
delayMicroseconds(1);
// klugdge to correct timings
PORTB = frameBuffer[36][newLine];
PORTB=PORTB;
PORTB=PORTB;
PORTB=PORTB;
delayMicroseconds(3);
}
//vsync
PORTB = _SYNC;
// if delaying for some reason
if(waiting)
{
// increment the waiting counter
waitingCount++;
// if waiting is over for a new game
if(waitingCount==DONE_WAITING & !justScored)
{
waitingCount=0;
// if on title screen
if(showingTitle)
{
// draw the loading bar
grayPixel(loadingBar,BASE_BAR);
loadingBar+=2;
// done loading
if (loadingBar > 37)
{
showingTitle=false;
clearScreen();
initGame();
initScreen();
waiting=false;
}
}
}
// waiting because someone scored
if(waitingCount==SCORE_WAITING & justScored)
{
justScored=false;
waitingCount=0;
waiting=false;
}
// wait for the remainder of the sync period
delayMicroseconds(305);
}
// not waiting
else
{
// increment the update delay counter
updateCounter++;
if( updateCounter >= UPDATE_INTERVAL)
{
//player movement
if(playerLeftTurn)
{
drawPaddle(PLAYER_LEFT_X,playerLeftOld,_BLACK);
playerLeft = analogRead(PLAYER_LEFT_PIN)>>6;
if(playerLeft<SCORE_BAR)
playerLeft=SCORE_BAR;
if(playerLeft>BASE_BAR)
playerLeft=BASE_BAR;
drawPaddle(PLAYER_LEFT_X,playerLeft,_WHITE);
playerLeftOld=playerLeft;
playerLeftTurn=false;
}
else
{
drawPaddle(PLAYER_RIGHT_X,playerRightOld,_BLACK);
playerRight = analogRead(PLAYER_RIGHT_PIN)>>6;
if(playerRight<SCORE_BAR)
playerRight=SCORE_BAR;
if(playerRight>BASE_BAR)
playerRight=BASE_BAR;
drawPaddle(PLAYER_RIGHT_X,playerRight,_WHITE);
playerRightOld=playerRight;
playerLeftTurn=true;
}
// remainder of sync period
delayMicroseconds(10);
updateCounter=0;
}
else
// remainder of sync period
delayMicroseconds(250);
// perform ball x velocity delay
ballXLoop--;
if(ballXLoop <= abs(ballXVel) and ballXVel != 0)
{
//ball movement;
drawBall(_BLACK);
updateBall(true);
ballXLoop=MAX_VEL;
}
// perform ball y velocity delay
ballYLoop--;
if(ballYLoop <= abs(ballYVel) and ballYVel != 0)
{
//ball movement;
drawBall(_BLACK);
updateBall(false);
ballYLoop=MAX_VEL;
}
// draw new ball
drawBall(_GRAY);
}
}
P.S.S. Не, не разорбался :( просмотрел скетч нашел
И все таки хочу заставить его работать на етом телеке. :)Код:// pal video line loop
до кучи ссылочка
http://www.elenafrancesco.org/arduino/
первые 2 проекта вроде то что нужно
---------------------------------------------
и еще страничка со списком OSD микросхем
http://deka18.tsk.ru/er/TV/osd.shtml
---------------------------------------------
И еще ссылочка... не совсем ардуино... но для базы знаний пойдет
http://www.micro-examples.com/public...d-superimposer
Советую использовать OSD микросхему, потому как на формирование видеосигнала уходит много ресурсов контроллера.
Микросхема MAX7456 может работать не только с внешним сигналом, у нее есть функция формирования синхроимпульсов. На видео в шапке видно что изображение не использует внешнего видеосигнала и синхроимпульсов
всетаки дороговата она... для прстого смертного 1000р, (600 если изголиться)...
А здесь по сути можно сделать тот же знакогенератор за 100-150р... и если постараться то даже попробовать генерировать готовый сигнал...
Но основное примениение выше указанных ссылок, это конечно же наложение текста/ картинки на готовый видеосигнал... например на камеру заднего вида...
А вообще куда нужни оставшиеся ресурсы ардуины? снять какие то показания? 1% от всех ресуров ардуины...
Вот например в этом проекте...
http://www.smalltim.ru/production/osd-mini/features/
ардуино не только генерирует/накладывает графическо символьную информацию, но при этом еще выводит и собирает информацию с различных датчиков и ЕЩЕ успевает анализиорвать и приобразовывать информацию с GPS приемника!!! :
•Полетное время
•Качество/наличие приема RC сигнала с передатчика для PPM приемников
•Высота по барометрическому датчику: -999..9999м (опционально)
•Воздушная скорость : 0..350км/ч (опционально)
•Температура : -45..+165°С
•Ток: 0..99А
•Напряжение (3 входа): 0..15В, автоматическое определение наличия подключения батареи
•Израсходованный заряд батареи: 0..9999мАч
•Высота по GPS: -999..9999м
•Скорость относительно земли по GPS: 0..999км/ч
•Расстояние по земле от точки взлета по GPS: 0..9999м
•Направление вектора текущей скорости: лента со шкалой "компаса"
•Направление на точку взлета: -180..180 градусов, лента с маркером "базы"
•Вариометр (набор/снижение высоты)
•Количество видимых спутников GPS: 0..12
•Формат определения положения модулем GPS: NA / 2D / 3D
•Широта/долгота в строковом виде: 1234.567N/89012.345E
http://www.smalltim.ru/netcat_files/...k_full_sc1.jpg
Красивый наложенный композитный сигнал (говорим только о монохромном, ибо цветной это другая песня совсем), что бы грамотно делать, нужно следующее:
1. При наложении пикселов нужно цеплятся к горизонтальной развертке, Hsync - иначе будут зубья
2. Если входной сигнал отъехал (камеру например отпилили бастарды во дворе), приличная схема должна уметь сама генерить развертку и писать в синий экран.
Все приведенные PIC схемы, используют свой клок на 27Mhz или около того. Контроллер будет нехило кушать. Для наших дел, частоту лучше сильно не задирать без надобности.
Соглашусь с Chip'om, MAX7456EUI+ - доступная у нас версия, все это делает. Это самый гуманный вариант.
Теоретически можно и*нутся, выделить и синхронизировать ПИК от горизонтальной развертки, прецеденты бывали. Встроенный A/D в ПИКах это позволяет, если лавэ савсем нэту ..
PS: Я заказал пару устройств с MAX7456. Приедут, поиграемся.
Если кого заинтересует , то у меня есть лишняя микросхема MAX7456EUI+
отдам за 800руб.
xDriver вроде не успел в свое время ;) может еще у него не пропало желание ? ;)
http://www.compcar.ru/forum/showpost...8&postcount=36
вот готовый вариант на MAX7456, и стоит как у нас одна микросхема
http://www.aliexpress.com/product-fm...olesalers.html
в комплекте есть все ПО для изменения и вшития шрифтов
Пожалуйста, подскажите вариант OSD на базе Arduino с возможностью вывода не только символов и псевдографики на их основе, но и графики (хочется выводить фрагмент карты поверх картинки с камеры). Если была бы возможность вывода не монохромного, а grayscale изображения - совсем отлично. Есть ли варианты, позволяющие выводить цветной оверлей?
С данной микросхемой нет такой возможности
ребят сильно не пинайте и извените что немного не потеме.Растолкуйте как работать с MAX7456
На gps телеметрии вышла из стороя эта микросхемка,а точнее входной видео сигнал не не поступает на видео выход вместо видео черный экран с данными телеметрии.Купил новую впаял.И теперь вместо положенных букв и цифр какието иероглифы но зато видео сигнал проходит.Как поправить это дело? Возможно ли слить данные со старой микрухи и влить в новую и как это сделать?
Подключаем по схеме
http://www.compcar.ru/forum/attachme...0&d=1271017122
дальше читаем здесь
Пока все ясно ардуинка есть небольшие навыки работы с ней имеюся.Остался вопрос в качесвет терминала подойдет PuTTY и пока непонятно каким образом рисовать шрифты для заливки в MAX
И всетаки, возможно прочитать из одной микрухи шрифты и залить в новую?
Для WinXP
Для Win7Цитата:
HyperTerminal (Гипертерминал) — терминальная программа, включенная в виде упрощенной версии в состав поставки ОС Windows 95, 98, ME, XP. При помощи данной программы осуществлялся доступ к другим компьютерам через модем, нуль-модемный кабель (последовательный порт) или с использованием протокола telnet. Изначально разработана компанией Hilgraeve для ОС Windows и OS/2
Поддерживает передачу файлов по протоколам Kermit, XMODEM, YMODEM/YMODEM-G, ZMODEM. Эмулирует терминалы VT/???
Часто использовалась для доступа к BBS, для настройки и диагностики работы модемов, для передачи файлов между компьютерами (в том числе наладонными) через последовательный порт. Также может использоваться для работы с оборудованием, предоставляющим порт, совместимый со стандартом RS-232, например управляемые свитчи и роутеры.
В операционных системах Windows 95, 98, 2000, XP по умолчанию программа HyperTerminal находится по цепочке: Пуск\ Все программы\ Стандартные\ Связь\.
Физически на диске модуль программы расположен "C:\Program Files\Windows NT\hypertrm.exe"
Это схема подключения для платы NANO я так понял.А вот если я юзаю плату на проце MEGA2560 то какие юзать пины на микросхеме. Платкак у меня такая http://www.rcgroups.com/forums/showthread.php?t=1381577
Пины PB0,PB1,PB2,PB3 они же в формате ардуино будут D53,D52,D51,D50
Спасибо!! Вы мне очень помогли.На днях будем пробывать прошивать макса.
Вот только не могу понять .... Если я нарисую шрифты в какомто определенном порядке ,скажем так от балды как они будут выводится на экран.На картинке ниже, то как они должны распологаться ,понятно какой символ что отображает.Если я правильно понял символы должны быть расположенны в какомто определенном порядке для макса чтобы проц (в моем случае STM32F) брал определенный символ и ставил его в определенное место.Как узнать какой символ куда воткнуть при рисовании шрифта мне непонятно :(:confused:
Смотри в сторону ASCII кодировки
У каждого символа есть код в таблице, например большая английская буква А будет иметь значение 41hex или 65 в десятичке
Приветствую.
Чет не получается залить шрифт.Все сделал по вашей инструкции.Юзаю ардуино нано.Залил скетч для заливки шрифтов.Подключил макса по схеме из первого поста.Открыл терминал выбрал com, указал фаил а оно вон что...
Пробывал указывать разные типы модемов перд отпракой файла ничего не выходит.
Протокол не правильно выбран
А может и правильно, я не помню, попробуй Z-modem
Похоже что нет связи с видеоконтроллером, напиши как подключил
Надеюсь что номер порта и его скорость правильно выбрал
Номер порта вы подразумеваете сом порт на котором сидит ардуинка,Ком выбрал 100% правильно потому как в терминале каждый раз появляется сообщение типа готов к передаче текста если жмякать ресет на ардуинке.Скорость 9600.
Подключал как на картинке.Питание ардуины естественно от USB, питание Макса от отдельного источника,может в этом проблема......СТОП а землю то я забыл:o
Хотя земля картину не поменяла :(
Да и еще светодиоды прим передача не моргают когда жму отправить фаил...
Есть у кого в продаже схемка? Или платка? Очень нуна...
У тебя же Mega?
В коде нашел еще 1 пин, но я помоему его не подключал, уже не помню давно это было
Цитата:
#define VSYNC 0x02// INT0
pinMode(VSYNC, INPUT);