Benq MP620 Beamer – remote control

Um den Beamer mit in die Hausautomatisierung aufzunehmen, muss er eine Netzwerkfähige Schnittstelle erhalten. Hierfür wird erstmal die IR Schnittstelle genommen und von da aus gehts weiter.

IR-Codes sind NEC Codes mit 32 Bits

Power: 0xC40BF

UP: 0xCA05F

Down: 0xC609F

LAN: 0xC00FF

Swap: 0xC48B7

hoch: 0xCD02F

runter: 0xC30CF

rechts: 0xC708F

links: 0xCB04F

MENU: 0xCF00F

AUTO: 0xC10EF

SOURCE: 0xC20DF

BLANK: 0xCE01F

MODE: 0xC08F7

keystone oben: 0xC50AF

keystone unten: 0xC906F

 

Aufgenommen mit Arduino IRremote lib, IRrecvDumpV2

eine neue Zeitrechnung beginnt…

…mein “Labor” wird um eine CNC-Fräse aufgerüstet!

Und zwar ist es so eine geworden. Dazu gibt es nema 23 schrittmotoren der “2 Ampere Klasse” mit dazugehöriger Leistungselektronik. Der Plan ist es das ganze mit einem Arduino Mega 2560 zu steuern auf dem gbrl läuft. Eventuell wird es auch gleich Firmware, mit der ich einmal auch zusätzlich einen Extruder und eine Heizplatte steuern kann um das ganze noch als 3D Drucker zu verwenden! 🙂

Vorteil gbrl + Arduino: ich kann das ganze wunderbar einfach an einen USB Port anschließen und muss mir keine weiteren Gedanken machen.

Als eins der ersten Projekte soll ein Arduino Shield enstehen das mir das direkte Anschließen der Leistungselektronik erlaubt, ohne einen großen Kabel-Verhau zu veranstalten.

 

UART RX

empfangsteil eines “software”-uarts:

ACHTUNG: versuch aus der zeit, in der ich mir VHDL erst noch beigebracht habe. 😉

-- uart.vhd
--
--        UART-RX
--
-- erstellt durch maximilian pautsch -> maximilian[at]hackwerk[punkt]de
-- 40MHz clock, 9600 baud, even parity, 8 bit!

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY uart_rx IS
    PORT(
    clk: IN std_logic;
    data: OUT std_logic_vector(7 downto 0);
    rx_port: IN std_logic;
    rx_error: OUT std_logic
    );
END uart_rx;

ARCHITECTURE arch OF uart_rx IS

        SIGNAL clk_count:       INTEGER RANGE 0 TO 260;
        SIGNAL bitcount:        INTEGER RANGE 0 TO 10; --wir brauchen 12 bit. das letzte ist force-high

        SIGNAL data_cache:      std_logic_vector(10 downto 0);
        SIGNAL abtastung:       INTEGER RANGE 0 TO 15;
        SIGNAL abtastung_val:   INTEGER RANGE 0 TO 15;

        SIGNAL parity  : std_logic  :='0';
        SIGNAL rx_run: BIT :='0';
        SIGNAL rx_ready: BIT :='0';

BEGIN  

run_check: PROCESS(rx_port,rx_ready)
	BEGIN
        IF rx_port='0' OR rx_ready='0' THEN
            rx_run <= '1';
        ELSE
    	    rx_run <= '0';
        END IF;
END PROCESS run_check;

run_rx: PROCESS (clk, rx_port)
    BEGIN

	IF (clk'event AND clk='1')  THEN
		IF  rx_run='1' THEN
			rx_ready<='0';

            IF clk_count = 260 THEN --- wir tasten jedes bit 16 mal ab!
                clk_count <= 0;
                IF abtastung < 15 THEN
                    abtastung <= abtastung +1;
                    IF rx_port='1' THEN
                        abtastung_val <= abtastung_val +1;
                    END IF;
                ELSE --- ein bit komplett abgetastet!

                    IF abtastung_val < 9 THEN
                        data_cache(bitcount) <= '0';
                    ELSE
                        data_cache(bitcount) <= '1';

                        IF bitcount > 0 AND bitcount < 9 THEN
                            ---- parity-control
                            IF parity='0' THEN
                                parity<='1';
                            ELSE
                                parity<='0';
                            END IF;
                        END IF;
                    END IF;

                    abtastung     <= 0;
                    abtastung_val <= 0;

                    IF bitcount = 10 THEN  -- alles komplett?

                        --- bit 1 ist das startbit und muss 0 sein. dann 8 daten, 1 parity und MINDESTENS 1 stopbit (high)
                        --- 9 muss noch auf parity gecheckt werden:
                        IF  data_cache(0)='0' AND ((data_cache(9)='0' AND parity='0') OR (data_cache(9)='1' AND parity='1')) AND data_cache(10)='1' THEN
                       		rx_error<='0';
                            data <= data_cache(8 DOWNTO 1);
						ELSE
	                       	rx_error<='1';
	                    END IF;

                        -- den ganzen uart_rx zurücksetzen:
	                    rx_ready <='1';
                        bitcount <= 0;
                        parity   <='0';
                    ELSE
                        bitcount <= bitcount+1;
                    END IF;
                END IF;
            ELSE
                clk_count <= clk_count+1;
            END IF;
        END IF;
    END IF;

END PROCESS run_rx;

END arch;

 

UART TX

sendeteil eines “software”-uarts:
ACHTUNG: versuch aus der zeit, in der ich mir VHDL erst noch beigebracht habe. 😉

-- uart.vhd
--
--        UART-TX
--
-- erstellt durch maximilian pautsch -> maximilian[at]hackwerk[punkt]de
-- 40MHz clock, 9600 baud, even parity, 8 bit!

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY uart_tx IS
    PORT(
    clk: IN std_logic;
    data: IN std_logic_vector(7 downto 0);
    transmit: IN std_logic;

    tx_port: OUT std_logic;
    tx_ready: OUT BIT
    );
END uart_tx;

ARCHITECTURE arch OF uart_tx IS
BEGIN  

run_tx: PROCESS (clk, transmit)
        VARIABLE clk_count: INTEGER RANGE 0 TO 4167;
        VARIABLE bitcount: INTEGER RANGE 0 TO 11; --wir brauchen 12 bit. das letzte ist force-high
        VARIABLE parity  : BIT  :='0';
        VARIABLE tx_run: BIT :='0';
        VARIABLE tx_event: BIT :='1';
    BEGIN

    IF transmit='1' AND transmit'event THEN
        tx_event := '1';
    END IF;
    IF tx_run='1' THEN
    	tx_event := '0';
    END IF;

	IF (clk'event AND clk='1')  THEN
		IF  tx_run='1' OR tx_event='1' THEN
			tx_run:='1';
			tx_ready<='0';

	        IF clk_count = 0 THEN

	            IF bitcount = 0 THEN
	                tx_port <='0';
	            ELSIF bitcount > 0 AND bitcount <9 THEN
	                tx_port <= data(bitcount-1);
	                IF (parity='1' AND data(bitcount-1)='1') OR (parity='0' AND data(bitcount-1)='0') THEN
	                	parity := '0';
	                ELSE
	                	parity := '1';
	                END IF;
	             --   parity := parity XOR data(bitcount-1);
	            ELSIF bitcount = 9 THEN     --parity
	            	IF parity = '1' THEN
	            		tx_port <= '1';
	            	ELSE
	            		tx_port <= '0';
	            	END IF;
	               -- tx_port <= parity;
	            ELSE
	                tx_port <='1';
	            END IF;

	            ----- ist die transmission zu ende? wenn ja: status setzen & für nächstes bit vorbereiten:
	            IF bitcount = 11 THEN
	                tx_ready <= '1';
	                bitcount := 0;
	                tx_run := '0';
	            ELSE
	                bitcount := bitcount +1;
                    -------berechnung des wertes: 40.000.000 / baudrate 
	                clk_count:=4167;  ---so viele clks während einem bit
	            END IF;

	        ELSE
	            clk_count:=clk_count-1;
	        END IF;

	    END IF;
	END IF;
END PROCESS run_tx;

END arch;

alle pdf in ordner durchsuchen

vielleicht findet das ja irgendjemand praktisch 😉
das script sollte alle pdfs in einem ordner nach einem string oder einer regexp durchsuchen und dann ausgeben wo er überall vorkommt!

#!/bin/bash
# searches for given string in pdfs
# usage: findpdf DIR STRING
# or   : findpdf STRING - defalt-dir is: ./

if [ -n "$2" ] ; then
	suche=$2;
	pfad=$1;
else
	if [ -n "$1" ] ; then
		pfad="./";
		suche=$1;
	else
		echo "usage: $0 [path] string"
		exit;
	fi;
fi;

for i in *.pdf;
do
	if pdftotext "$i" - | grep -E "$suche" 1>/dev/null; then
		echo "found string in: $i";
	fi;

done;

automatisches bildschirmdrehen

dieses kleine programm dreht den x11 desktop, der auf einem ibm notebook mit eingebautem beschleunigungs-sensor läft, sobald das notebook gedreht wird. so kann man beispielsweise din4-seiten besser skaliert darstellen und lesen. außerdem isses cool! 😉 wenn man das ganze programm compiled und nach /home/USER/.kde/Autostart/* kopiert, wird es mit jedem kde start ausgeführt! hier das programm:

#include <stdio.h>

int main(){
	int x,y,pos_x;
	int x_cal, y_cal;

	//pos 1= links; 0=mitte ; 2 = rechts
	int pos=0;

	FILE *sensor;

	if(!(sensor=fopen("/sys/devices/platform/hdaps/calibrate", "r"))){
		printf("nkonnte den sensor nicht finden. breche ab!n");
		return 1;
		}
	fscanf(sensor, "(%d,%d)", &x_cal, &y_cal);
	fclose(sensor);

	for(;;){
		sensor = fopen( "/sys/devices/platform/hdaps/position", "r" );

		if(!sensor){
			printf("nkonnte den sensor nicht finden. breche ab!n");
			return 1;
			}

		fscanf(sensor, "(%d,%d)", &x, &y);
		//printf("n %i %i",x-x_cal,y-y_cal);

		fclose(sensor);

		pos_x=x-x_cal;
		if(pos_x>130 && pos!=1){
			pos=1;
			system("xrandr -o right");
			}
		else if(pos_x<-130 && pos!=2){
			pos=2;
			system("xrandr -o left");
			}
		else if(pos!=0 && pos_x>-130 && pos_x<130){
			pos=0;
			system("xrandr -o normal");
			}
		usleep(50000);
		}
	}

 

tool dragster

 

ein tool-dragster-rennen ist ein beschleunigungs-rennen, das selbstgebaute fahrzeuge bestreiten, die von einem werkzeug angetrieben werden müssen. dabei ziehen sie zur stromversorgung ein schleppkabel hinter sich her.

mein dragster wird von einer handkreissäge aus dem schrott angetrieben (der entstörkondensator und der griff waren total verbrannt – aber wer braucht sowas schon?! *g*) zur verzierung wurde ein altes skateboard teilweise oben draufgeschraubt.. hoffe aber, dass mir noch was kreativeres einfällt! 😉

errechnete end-geschwindigkeit bei nenndrehszahl: um die 95 km/h.

toolDragster2

toolDragster1