Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  1 3515
ओम नमो नारायण
Dodecha's Avatar
DonorCrew
Jeg er på ingen måte noe hardware nerd, jeg har lært både to og tre nye ting under dette prosjektet.
Utgangspunktet mitt er selvlært linux bruker, en liten sidejobb som montør innen media og lyd ga meg den lille kunnskapen jeg
trengte for å realisere prosjektet.

Nye innovasjoner skal oftest løse et problem, og i dette tilfellet dreier det seg om å slippe unna
en gåtur samt å henge utenfor en branntrapp i 6. etg.
For det har seg slik at vi noen ganger projiserer et bilde/tekst på utsiden av bygget vårt.
Dette foregår ved at man tar med seg en projektor, og en liten datamaskin, går til hotellet på andre siden av gaten tar heisen
opp så langt det går og klatrer opp i toppen av rømningstrappen. Der må man klatre opp på rekkverket og henge denne jævla kjipe boksen
starte datamaskinen, bla bla.

Jeg fantaserte om å gjøre dette mer praktisk, ideen ble enda mer interessant når jeg kom over raspberry pi.


Denne søte lille saken fristet meg så jævlig mye, selv om jeg ikke ante hva jeg skulle bruke den til først, at jeg måtte kjøpe den.

Det aller første jeg gjorde med den var å peise inn omxplayer (en medieavspiller skreddersydd for ARM cpuen i raspberryen), slenge inn
samba og vips hadde jeg et mediecenter til skarve
300 kr som kjørte full 1080p.
Jeg brukte den også på jobb til å vise bilder på den projektoren, men jeg måtte fremdeles fysisk gå over veien, opp i trappetårnet og
koble den til.
Så tok jeg på meg en installatørjobb, det hele dreide seg om å sette seg inn i mediekontrollsystem, lære såvidt om RS232,
programmere kontrollpanelet og terminere signalkabler mellom utstyret etc.
Etter denne jobben klødde jeg etter raspberryen igjen, den har jo endel I/O porter stikkende ut av seg som man kan tukle med, etter
litt browsing og en feilbestilling så kom jeg over denne her.
Du skjønner, planen var å bare bruke noen jumperkabler fra Raspberry PIO pinnene og til RS232 (COM port) på projektoren, problemet er
at PIO pinnene på raspberryen er 3.3V mens RS232 går på 12V, så man må ha en level switch som regulerer spenningen.


Programmeringen
Jeg hadde startet å sett på hvordan jeg skulle kommunisere over RS232 til projektoren, jeg kom over C/C++ eksempler, noe python men
endte til slutt å bare bruke bash, dette kan jo godt endre seg over tiden, men det var så enkelt å få til i bash.

NB! For å bruke serialporten på raspberry pi er det et par konfigurasjonsfiler du må endre et par linjer i
Denne siden forklarer alt.

eksempel:

Kode

#!/bin/bash
# Set baud rate of serial port
stty -F /dev/ttyAMA0 19200
#Power on
echo "Powering on Projector 3M MP8795"
printf "\xBE\xEF\x03\x06\x00\xBA\xD2\x01\x00\x00\x60\x01\x00" > /dev/ttyAMA0
Seriell kommunikasjon er relativt lavnivå, alt må inn med teskje, så vi må først sette rett hastighet på porten.
19200 baud i dette tilfellet (spesifisert i projektor manualen).
Så kommer selve dataen vi skal sende, linjen med printf kommandoen.
\x spesifiserer at det er HEX vi sender, i dette tilfellet:
BE EF 03 06 00, som er header
BA D2 01 00, er kommandoen
00 60 er type
01 00 er set kode

Dette er også spesifisert i manualen, denne kommandoen skrur på projektoren, nyere projektorer har ofte kortere instrukser enn dette gamle 3M beistet,
noen ned i bare et par bytes.

Montering for testing

Her er da projektoren med raspberryen, tilkoblet er RS232 DB9 kabel, HDMI til en skjerm, trådløst tastatur/mus.


Til min ergrelse så har denne drittprojektøren en RS232 DB15 tilkobling (også kallt RS232C i manualen, noe som er tåpelig i og med at C bare betyr "current version" og
ikke er noe standard).
Jeg løste problemet ved å kjøpe noen jumper kabler og en RS232 kabel på clas ohlson, kuttet den og loddet pinnene jeg trengte til kabelen:
TX, RX og Jord.
Resultatet fungerer kjempebra, men jeg burde vel finne på noe annet til fastmonteringen, denne rs232C pluggen er dønn lik en VGA Hann.


Her er testingen i gang, det var en del starproblemer, bl.a. noe så tåpelig som at jeg må "tvinge opp" com porten
ved å lytte på den.
Jeg kom over løsningen på et eller annet forum som jeg ikke finner igjen i farten,
man starter en cat /dev/ttyAMA0 >> output.txt i bakgrunnen før man sender data.


Så lang jeg har kommet nå ser alt ut til å være på plass, jeg har skrevet meg et kontrollpanel i php som
gjør at jeg kan kontrollere hele greia fra web, jeg kan legge ut scriptet om noen er interessert, men jeg må på
forhånd advare folk om koden min.
Det neste steget er noen trådløs bridger med direksjonell antenne e.l. sånn at jeg kommunisert med systemet, kanskje
jeg setter meg ned og lager små C programmer til å ta seg av seriellkommunikasjonen etterhvert.
De av dere som er kjente med slike systeme har kanskje lagt merke til at kommunikasjonen er enveis, jeg får altså ingen feedback fra projektoren, dette må jeg se på etterhvert.

Håper dette var til nytte for noen!
▼ ... flere år senere ... ▼
ओम नमो नारायण
Dodecha's Avatar
Trådstarter DonorCrew
Da har tiden kommet for noe nekromansi, i form av å gjennopplive dette prosjektet.

Det hele startet med at Raspberry pi 3 har kommet, nå med innebygget blåtann og trådløstnett!
Jeg fortsatte der jeg slapp, dette hersens irriternde problemet med at kommandoene ikke ble sendt med mindre jeg faktisk lyttet på porten (en cat /dev/ttyAMA0 på de tidligere raspberryene), dette har med initialiseringen å gjøre, og jeg fant rett å slett ikke noen fornuftig måte å gjøre dette i bash foruten den tåpelige lyttemetoden nevnt tidligere.

Men slik kan vi da for svarte ikke ha det i et (tilsynelatende) velfungerende hjem!?
Jeg tok mine hullete kodekunnskaper og terpet litt på C/C++ igjen, og etter noe kodestjeling kom jeg frem til noe som fungerte:

Obs her er at koden er beregnet for Raspberry Pi 2, modell 3 bruker en ny serial device kallt /dev/serial0 i stedet for /dev/ttyAMA0.

Kode

#include <stdio.h>
#include <unistd.h>           
#include <fcntl.h>               
#include <termios.h>         
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>

struct termios tc;
// If open then close
if (_fdOut != -1) {
	close(_fdOut);
	_fdOut = -1;
}

if ((_fdOut = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_SYNC | O_NONBLOCK)) == -1)
{
	printf("Open failed.. Do you have the right privileges?\n");
	return false;
}


if (tcgetattr(_fdOut, &tc))
{
	return false;
}
/* input flags */
    tc.c_iflag &= ~ IGNBRK; /* enable ignoring break */
    tc.c_iflag &= ~(IGNPAR | PARMRK); /* disable parity checks */
    tc.c_iflag &= ~ INPCK; /* disable parity checking */
    tc.c_iflag &= ~ ISTRIP; /* disable stripping 8th bit */
    tc.c_iflag &= ~(INLCR | ICRNL); /* disable translating NL <-> CR */
    tc.c_iflag &= ~ IGNCR; /* disable ignoring CR */
    tc.c_iflag &= ~(IXON | IXOFF); /* disable XON/XOFF flow control */
    /* output flags */
    tc.c_oflag &= ~ OPOST; /* disable output processing */
    tc.c_oflag &= ~(ONLCR | OCRNL); /* disable translating NL <-> CR */
    /* not for FreeBSD */
    tc.c_oflag &= ~ OFILL; /* disable fill characters */
    /* control flags */
    tc.c_cflag |= CLOCAL; /* prevent changing ownership */
    tc.c_cflag |= CREAD; /* enable reciever */
    tc.c_cflag &= ~ PARENB; /* disable parity */
    tc.c_cflag &= ~ CSTOPB; /* disable 2 stop bits */
    tc.c_cflag &= ~ CSIZE; /* remove size flag... */
    tc.c_cflag |= CS8; /* ...enable 8 bit characters */
    tc.c_cflag |= HUPCL; /* enable lower control lines on close - hang up */
    if (fRtsCts)
        tc.c_cflag |= CRTSCTS; /* enable hardware CTS/RTS flow control */
    else
        tc.c_cflag &= ~ CRTSCTS; /* disable hardware CTS/RTS flow control */
    /* local flags */
    tc.c_lflag &= ~ ISIG; /* disable generating signals */
    tc.c_lflag &= ~ ICANON; /* disable canonical mode - line by line */
    tc.c_lflag &= ~ ECHO; /* disable echoing characters */
    tc.c_lflag &= ~ ECHONL; /* ??? */
    tc.c_lflag &= ~ NOFLSH; /* disable flushing on SIGINT */
    tc.c_lflag &= ~ IEXTEN; /* disable input processing */

    /* control characters */
    memset(tc.c_cc,0,sizeof(tc.c_cc));

    /* set i/o baud rate */
    cfsetspeed(&tc, B19200);

    tcsetattr(_fdOut, TCSAFLUSH, &tc);

    /* enable input & output transmission */
    tcflow(_fdOut, TCOON | TCION);
Koden er ærlig og redelig stjelt fra Kurt E. sitt WrapperSerial prosjekt.

Blir nok mer RaspberryPI tukling fremover, jobber med et autovanneprosjekt i tillegg, skal lage en tråd om det når det er litt mer på stell.