Передача изображения с Arduino на компьютер через serial

blackhand
Offline
Зарегистрирован: 13.10.2012

У меня стоит такая задача - с помощью ардуины захватить изображение, а потом передать его на компьютер.

Нашёл такую Grove Serial Camera http://devicter.ru/goods/Grove-Serial-Camera-Kit?from=ZWM2 , которая дружит с ардуиной. К ней прилагается демо-код в котором описано, как захватить с этой камеры изображение и записать его на флешку. Но мне надо передать его на компьютер. Раз камера заявлена, как Serial, может быть,  возможно передать изображение на компьютер через Serial соединение ардуины? 

Заранее спасибо.

Демо-код на всякий случай прилагаю.

 

//  File SerialCamera_DemoCode_CJ-OV528.ino
//  8/8/2013 Jack Shao
//  Demo code for using seeeduino or Arduino board to cature jpg format
//  picture from seeed serial camera and save it into sd card. Push the
//  button to take the a picture .
//  For more details about the product please check http://www.seeedstudio.com/depot/

#include <arduino.h>
#include <SD.h>

#define PIC_PKT_LEN    128                  //data length of each read, dont set this too big because ram is limited
#define PIC_FMT_VGA    7
#define PIC_FMT_CIF    5
#define PIC_FMT_OCIF   3
#define CAM_ADDR       0
#define CAM_SERIAL     Serial

#define PIC_FMT        PIC_FMT_VGA

File myFile;

const byte cameraAddr = (CAM_ADDR << 5);  // addr
const int buttonPin = A5;                 // the number of the pushbutton pin
unsigned long picTotalLen = 0;            // picture length
int picNameNum = 0;

/*********************************************************************/
void setup()
{
    Serial.begin(115200);
    pinMode(buttonPin, INPUT);    // initialize the pushbutton pin as an input
    Serial.println("Initializing SD card....");
    pinMode(10,OUTPUT);          // CS pin of SD Card Shield

    if (!SD.begin(10)) 
    {
        Serial.print("sd init failed");
        return;
    }
    Serial.println("sd init done.");
    initialize();
}
/*********************************************************************/
void loop()
{
    int n = 0;
    while(1){
        Serial.println("\r\nPress the button to take a picture");
        while (digitalRead(buttonPin) == LOW);      //wait for buttonPin status to HIGH
        if(digitalRead(buttonPin) == HIGH){
            delay(20);                               //Debounce
            if (digitalRead(buttonPin) == HIGH)
            {
                Serial.println("\r\nbegin to take picture");
                delay(200);
                if (n == 0) preCapture();
                Capture();
                GetData();
            }
            Serial.print("\r\nTaking pictures success ,number : ");
            Serial.println(n);
            n++ ;
        }
    }
}
/*********************************************************************/
void clearRxBuf()
{
    while (Serial.available())
    {
        Serial.read();
    }
}
/*********************************************************************/
void sendCmd(char cmd[], int cmd_len)
{
    for (char i = 0; i < cmd_len; i++) Serial.print(cmd[i]);
}
/*********************************************************************/
void initialize()
{
    char cmd[] = {0xaa,0x0d|cameraAddr,0x00,0x00,0x00,0x00} ;
    unsigned char resp[6];

    Serial.setTimeout(500);
    while (1)
    {
        //clearRxBuf();
        sendCmd(cmd,6);
        if (Serial.readBytes((char *)resp, 6) != 6)
        {
            continue;
        }
        if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x0d && resp[4] == 0 && resp[5] == 0)
        {
            if (Serial.readBytes((char *)resp, 6) != 6) continue;
            if (resp[0] == 0xaa && resp[1] == (0x0d | cameraAddr) && resp[2] == 0 && resp[3] == 0 && resp[4] == 0 && resp[5] == 0) break;
        }
    }
    cmd[1] = 0x0e | cameraAddr;
    cmd[2] = 0x0d;
    sendCmd(cmd, 6);
    Serial.println("\nCamera initialization done.");
}
/*********************************************************************/
void preCapture()
{
    char cmd[] = { 0xaa, 0x01 | cameraAddr, 0x00, 0x07, 0x00, PIC_FMT };
    unsigned char resp[6];

    Serial.setTimeout(100);
    while (1)
    {
        clearRxBuf();
        sendCmd(cmd, 6);
        if (Serial.readBytes((char *)resp, 6) != 6) continue;
        if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x01 && resp[4] == 0 && resp[5] == 0) break;
    }
}
void Capture()
{
    char cmd[] = { 0xaa, 0x06 | cameraAddr, 0x08, PIC_PKT_LEN & 0xff, (PIC_PKT_LEN>>8) & 0xff ,0};
    unsigned char resp[6];

    Serial.setTimeout(100);
    while (1)
    {
        clearRxBuf();
        sendCmd(cmd, 6);
        if (Serial.readBytes((char *)resp, 6) != 6) continue;
        if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x06 && resp[4] == 0 && resp[5] == 0) break;
    }
    cmd[1] = 0x05 | cameraAddr;
    cmd[2] = 0;
    cmd[3] = 0;
    cmd[4] = 0;
    cmd[5] = 0;
    while (1)
    {
        clearRxBuf();
        sendCmd(cmd, 6);
        if (Serial.readBytes((char *)resp, 6) != 6) continue;
        if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x05 && resp[4] == 0 && resp[5] == 0) break;
    }
    cmd[1] = 0x04 | cameraAddr;
    cmd[2] = 0x1;
    while (1)
    {
        clearRxBuf();
        sendCmd(cmd, 6);
        if (Serial.readBytes((char *)resp, 6) != 6) continue;
        if (resp[0] == 0xaa && resp[1] == (0x0e | cameraAddr) && resp[2] == 0x04 && resp[4] == 0 && resp[5] == 0)
        {
            Serial.setTimeout(1000);
            if (Serial.readBytes((char *)resp, 6) != 6)
            {
                continue;
            }
            if (resp[0] == 0xaa && resp[1] == (0x0a | cameraAddr) && resp[2] == 0x01)
            {
                picTotalLen = (resp[3]) | (resp[4] << 8) | (resp[5] << 16);
                Serial.print("picTotalLen:");
                Serial.println(picTotalLen);
                break;
            }
        }
    }

}
/*********************************************************************/
void GetData()
{
    unsigned int pktCnt = (picTotalLen) / (PIC_PKT_LEN - 6);
    if ((picTotalLen % (PIC_PKT_LEN-6)) != 0) pktCnt += 1;

    char cmd[] = { 0xaa, 0x0e | cameraAddr, 0x00, 0x00, 0x00, 0x00 };
    unsigned char pkt[PIC_PKT_LEN];

    char picName[] = "pic00.jpg";
    picName[3] = picNameNum/10 + '0';
    picName[4] = picNameNum%10 + '0';

    if (SD.exists(picName))
    {
        SD.remove(picName);
    }

    myFile = SD.open(picName, FILE_WRITE);
    if(!myFile){
        Serial.println("myFile open fail...");
    }
    else{
        Serial.setTimeout(1000);
        for (unsigned int i = 0; i < pktCnt; i++)
        {
            cmd[4] = i & 0xff;
            cmd[5] = (i >> 8) & 0xff;

            int retry_cnt = 0;
            retry:
            delay(10);
            clearRxBuf();
            sendCmd(cmd, 6);
            uint16_t cnt = Serial.readBytes((char *)pkt, PIC_PKT_LEN);

            unsigned char sum = 0;
            for (int y = 0; y < cnt - 2; y++)
            {
                sum += pkt[y];
            }
            if (sum != pkt[cnt-2])
            {
                if (++retry_cnt < 100) goto retry;
                else break;
            }

            myFile.write((const uint8_t *)&pkt[4], cnt-6);
            //if (cnt != PIC_PKT_LEN) break;
        }
        cmd[4] = 0xf0;
        cmd[5] = 0xf0;
        sendCmd(cmd, 6);
    }
    myFile.close();
    picNameNum ++;
}

 

koikoliner
koikoliner аватар
Offline
Зарегистрирован: 21.08.2014

Приветствую!

Сам новичек в Arduino, но ковыряюсь по-маленьку.

Приложенная программа работает с камерой на Ethernet shield с SD картой, но при условии, что в строке инициализации карты будет стоять SD.begin(4) , а не 10, поскольку карта управляется четвертой ногой.

В остальном, как ни бьюсь, мало что получается. Описания регистров камеры нет нигде, даже скорость поднять не могу, хотя заявлена 115. Не понятно, может ли качать видео, в описании не сказано, но абсолютно аналогичная камера mini из их же это комплекта делает запросто, но пишет сама на свою карту. Правда мне, похоже, досталась бракованная: при подключении по 8-пиновому кабелю питание пропадает и записанные файлы не вижу. А так Вы могли ы видеть эти картинки на внешнем накопителе. А если еще его подключить к дропбоксу или другому облаку - то сразу в эфире.

Пока так ковыряю, если надо - буду писать о ходе расследования. 

Взаимно был бы признателен, если что накопаете сами.

Дмитрий

 

koikoliner
koikoliner аватар
Offline
Зарегистрирован: 21.08.2014

У меня и Raspberry есть, и arduino, всех пробую.

Нам в кампусе ДВФУ просят сигнализацию наваять недорогую, но чтобы фото или видеофиксация была.

Для руководителей надо, чтобы и трансляция приемной шла на монитор или телек, чтобы видеть, кто в приемной.

Так вот, я попробовал Mini serial camera с SEEED Studio. У нее есть прикольная вещь, встроенная флешка, на которую пишется видео или фото по команде с пина. Кроме параллелки у него есть соннект через USB, и я хочу подключить его через USB shield, а потом через Ethernet Shield выдавливать эти файлики в сеть на сервер. Думаю, такое решение сэкономит денег, будет грузить трафик сети, но не нагружать процессор.

Что касается Rsap, то у меня пока не получилось адекватно запустить видеотрансляцию, но уже приблизился к этому. Картинку в стриме открываю вне сервера, сервер вижу, осталось их скрестить. Вопрос: две или четыре камеры на одну плату повесить можно или уже не справится?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

art100 пишет:

koikoliner пишет:
... Arduino... камеры...

20$ ну-ну

для этого придумыли побыстрее raspberry специально видео чип распаяли и толстую ОС дали чтоб что-то графическое

есть одна библиотека где выгонял товарищ несложный текст в готовый видео вход навигатора но все это убого

а как что-то цветное графика труба дело 

не каждый жки успевают потрясти

сам не первый станок с ЧПУ поднял и пользую классические 16х2 20x4 потому как ресуров остается что-то делать

не та ценовая категория для графики много времени на графику потратиет и упретесь в ресурсы

arduino это прекрасные 1.роботы 2.сигнализации 3.автоматика дома

4.станки с ЧПУ это их предел нагрузки допустим Arduino Mega ADK с абвязкой 48$ за железо логики без софта.

На днях поднял видео мультимедия новомодное 200$ не поверите опять Intel впереди планеты всей Windows Linux без вентиляторный.

Я и на raspberry мультимедия поднял 190$ выводы делыйте сами

Я просто тащюсь от твоих заяв. Они всегда звучат так напышенно, как истина в последней инстанции. Хочешь, я покажу тебе как за 100 баксов собрать мультимедия на ардуине? и камеры и дисплеи ( дисплей будет стоить отдельно конечно, ибо фиг знает может тебе в виде дисплея видится 4К монитор)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

koikoliner пишет:

Что касается Rsap, то у меня пока не получилось адекватно запустить видеотрансляцию, но уже приблизился к этому. Картинку в стриме открываю вне сервера, сервер вижу, осталось их скрестить. Вопрос: две или четыре камеры на одну плату повесить можно или уже не справится?

берем ардуинку от интела :)

http://ca.mouser.com/ProductDetail/Intel/GALILEO/?qs=IN21uv1u6AnLUWebBku...

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

koikoliner
koikoliner аватар
Offline
Зарегистрирован: 21.08.2014

Что про напыщенность, так это у меня наоборот растерянность. Я лет 20 не программировал, опять приходится вникать, а во вторых - действительо не так все просто, чтобы считать что-то последней инстанцией. Гроб - последняя инстанция. ;-)

Спасибо за поддержку, потею дальше, изучаю присланное.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Не парься - напыщенность, это не про тебя было ))))) Это art100 всегда такие заявы кидает, а потом спешно начинает свои посты редактировать. :)

art100
Offline
Зарегистрирован: 09.03.2014

JollyBiber пишет:

Не парься - напыщенность, это не про тебя было ))))) Это art100 всегда такие заявы кидает, а потом спешно начинает свои посты редактировать. :)

расслабся я подчишаю потому что это мне денюжку сейчас должно принести

актуальность

и это наверно сейчас подотру

человек прочитает опыт сын ошибок трудниых и подотру

вот заказчик прийдет денюжку думаю 100-ку за успех возму и подотру

лучше покажи живое свое видео

 

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

art100 пишет:

на распери у меня есть видео потоковое решение за пару соток баксов

Да этож просто праздник какой-то! (с) Карабас Барабас

Пара соток баксов стоит пандаборд. Даже уже с HDMI выходом.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

art100 пишет:

расслабся я подчишаю потому что это мне денюжку сейчас должно принести

актуальность

и это наверно сейчас подотру

вот заказчик прийдет денюжку думаю 100-ку за успех возму и подотру

лучше покажи живое свое видео

Гы. Вы так быстро и много редактируете, что я не успеваю отвечать.

Ну Вы  то, судя по Вашей стилистике и ненависти к знакам препинания, на таком расслабоне, что панды с черепахами плачут от зависти горючими слезами. Вон еще и шар Ваш хрустальный показывает что я напрягаюсь.

Зачем я кому-то что-то буду показывать? Меня "заказчики", что аж сотку приносят - не интересуют.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

art100]</p> <p>[quote=JollyBiber пишет:

art100 пишет:
...шар Ваш хрустальный показывает что я напрягаюсь....

Даже интересно стало. Где это и что это вы увидели?

Покажите свой хрустальный шар?

Не вопрос:

art100 пишет:

расслабся я подчишаю потому что это мне денюжку сейчас должно принести

art100
Offline
Зарегистрирован: 09.03.2014

koikoliner

 Вы уже поняли вы своим видео рубку на паяльниках начали.

1.Я свое живое видео показал. Работает. И сказал ключевые слова Intel, Linux/Windows, WebCamers Soft класика количество и качество видеоптоков more .

2.По поводу Raspberry уточняю Raspberry PI 512, Debian, Ethernet однопотоковое видео в/из сети.

3.Ждем видео фото для слов Arduino ??? ??? ??? ???

Верхняя планка цены качества задана. Посмотрим кто хоть как-нибудь дотянется.

Переходящее красное знамя за высокие показатели в социалистическом соревновании вручено. ;)

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

art100

Я так понимаю это камень в мой огород? Чтобы балаболом не считаться - приведите мои сообщения со словом "Ардуино/Дуня" итд. из этой ветки.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

art100 пишет:

Что по вашему мнению видео потоки потянет из слов Arduino?

Поиск поможет по форуму. Эта тема уже х-раз поднималась.

art100 пишет:

Это не троллинг это вопрос. Вы тут читаете и админ или я?

Я тут не админ :D Я просто пишу много.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Galileo покопайте.

Раз уж Вам лень искать. Копья преидущих дискусий:

Нормальное видео ни одна Дуня не потянет.

Для каждого понятие "нормального" видео свое

Дешевого и хорошего решения - нет.

Потоковое видео, однонаправленное на мк - есть (ценник в районе 400 нерублей)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

art100 пишет:

3.ethernet щиток удешевлен безтрансформатора

Буду придитаться к словам: Уже с конца прошлого века трансформаторы стоят внутри коннектора.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
art100
Offline
Зарегистрирован: 09.03.2014

спасибо высмотрел что катушки внутри залиты http://www.terraelectronica.ru/ds/pdf/h/hr911105a.pdf

А чего же он такое авно неустойчивое на чистых библиотеках, а на него со стороны linux redhat dhcp.release message как он адрес берет смотрю авно авном Вроде если расслабить его поисками и ткунть носом статический адрес вроде что-то устойчиво. Я думал потому что там вариант на чистых КТ315-ых приемник и передатчик потому форма кривая надо будет осцилографом с мегомным входом послушать или забить просто . Webinterface написал на ардуинку и езернетщиток солнце взошло на 20см от свича на безперебойнике и забыть.

Заметили мы от чудо ардуин и видео удалились

Неужели пороновидео с ArduinoDue не получили? Посмотрел 32 бита а тааам 84 мегагерца скорострельность.

Вон ресурсов на аля Sincliar вроде хватает и даже некая типа VGA https://www.youtube.com/watch?v=FRbr8ulNP5M

Одну камеру видео поток на ЖКИ тормоз ST7785(я меня похоже на этом чипе уже ковырял) с тормозами хватает https://www.youtube.com/watch?v=zgiL_f0HxRc тормоза я думаю из-за чипа в жки не помню подробности по шинке spi вроде 8 бит подсасывает с тормозами

 

ТС я вроде нашел ваш будущий результат

https://www.youtube.com/watch?v=zfDc6CXoL-Y

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

Как пронесет быстро на видеорегистратор заводского изготовления потому что дешевле поменяете.

думаю буде полезно понять хоть как vga статику выгоняют 320х200 http://forum.arduino.cc/index.php/topic,150517.0.html

для Arduino Due https://github.com/stimmer/DueVGA/archive/0.512.zip хоть что-то

По мне фигня это все а не рассмотреть что там было.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

art100

Скажите, Вы правда думаете что это возможно понять?

Webinterface написал на ардуинку и езернетщиток солнце взошло на 20см от свича на безперебойнике и забыть.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

WНнАиЕСВн20оСнБиЗ

Чем это читабельнее?!?!?!

art100
Offline
Зарегистрирован: 09.03.2014

JollyBiber пишет:

WНнАиЕСВн20оСнБиЗ

Чем это читабельнее?!?!?!

Шутить изволите? У вас по теме видео есть что-нибудь или так и будете ни о чем сотрясать?

Лучше посоветуйте как мне ШИМ-ы на разные ножки развести и IRremote.h . Кто-то говорит попробуй pwm.ino с этого форума и инфрокрасник перепаяй на 9-ую ногу привязанную к тамеру 1-ому на arduinouno/

Я думаю если всн равно паяльником провода перкидывать, почему лучше сразу раскидать ШИМ-ы в раскосяк но чтоб классика 

analogWrite(Motor12,Speed1);// понежней понежней мотором крути пока не порвало все наик

Как вы думаете

2 мотора DC визжат как дурные от L298-ой прекрасно

1 ИК приемник не помню но что-то там занимает

1 радио NF24 шустрый дуплекс по любому на ногах 9 10 11 12 13 висит

Стоит нестардащину прикручиать или пяльником потыкать и успокоить гугл?

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

....вторым предложением :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

кто дешевле? да легко

55 баксов комп

http://beagleboard.org/black

+6 баксов камера

http://www.aliexpress.com/item/USB-3LED-Webcam-PC-Camera-Web-Cam-HD-With...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

art100 пишет:

вот когда соберете на том кортексе-а8 хоть что-нибудь

1-ое как минимум будет цена за 150$ 

2-ое подожду

Я то с этой платкой справлюсь, а вы пробовали ее прежде чем писать?

Соменваюсь что ТС и вы слышали что-то про v4l?

1. она уже собраная. там ничего не нужно собирать втыкай камеру и вперед на мины. откуда там еще 100 баксов набежит то?

ты бухать то прекращай. а то остатки серого вещества разьест.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

art100 пишет:

Вот когда соберете на том кортексе-а8 хоть что-нибудь? Где? Ну вижу от вас?

 я пока вижу какие то мутные фото, снятые на пленочную камеру и слышу бредовые сказки пьяного неадеквата :)

koikoliner
koikoliner аватар
Offline
Зарегистрирован: 21.08.2014

Народ, извиняюсь, что так завел вас...

Для моей задачи достаточно стрима и в 1 кадр в секунду, даже реже. Я купил на seeed две камеры на пробу, я писал, Grove camera kit и Mini camera.

Обе имеют право на жизнь. Но в первой пробема с изменением скорости по параллельному интерфейсу: ардуина дает в терминал хоть 115200, а вот с камерой общается только на 9600, что тормозит загрузку в карту на Ethernet shield. Оттуда бы я файло перекачал куда надо и последний с ненулевымразмером выдавал бы на страницу.

Вторая камера тоже имеет проблему, к ее собственной карте теоретически можо подключиться по кабелю USB, но у меня не вышло. То ли кабелино плохой (а я второй уже попробовал сегодня), то ли камера бракованная.

Все бы ничего, если бы на них были датащит или схемы, подаялся бы хоть на другой разъем (во второй стоит китайский 8пиновый чучело).

Я написал в seeed, они мычат и как бы не слышат вопросов. Только гарантиный вопрос по подключению обсуждают со мной. 

В первой камере по скорости может поперебирать регистры? Что посоветуете?

Готов поиграться вместе не забесплатно даже...

art100
Offline
Зарегистрирован: 09.03.2014

Я пас.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

koikoliner пишет:

Что про напыщенность, так это у меня наоборот растерянность. Я лет 20 не программировал, опять приходится вникать, а во вторых - действительо не так все просто, чтобы считать что-то последней инстанцией. Гроб - последняя инстанция. ;-)

Спасибо за поддержку, потею дальше, изучаю присланное.

просто интересно что вы программировали 20 лет назад?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

koikoliner пишет:

..... ардуина дает в терминал хоть 115200....

Ардуина даёт 500000, проверено  Megunolink

Ардуина даёт 921600, проверено  Realterm

slavik73
Offline
Зарегистрирован: 13.12.2014

Если еще не нашли - оно существует. http://www.fut-electronics.com/wp-content/plugins/fe_downloads/Uploads/Serial%20Camera%20Module%20Programming%20Instructions%20and%20Tutorial.pdf. Там есть ссылка на библиотеку, но ее надо подточить к свежей версии IDE. Что я заметил - видимо есть некая корреляция между скоростью чтения и размером кадра. В общем, если быстро читать больше 64 байт - камере быстро становится плохо (после в среднем 300 картинок 320х240 у меня) и софт-ресет не всегда помогает ....

Я игрался с LinkIT ONE, с родной ардуиной не пробовал. У меня с аппаратным Serial1 более-менее работает 38400 с буфером 64 байт, но все равно есть сбои при чтении картинки.