Arduino bez Arduino IDEa

Nije bas bez IDEa, ali korišćenjem regularnog editora (u mom slučaju vima) i make-a, a IDE morate da instalirate zbog svih ostalih fajlova i dependinga.

Makefile:

AVR_GPP = avr-g++
AVR_GCC = avr-gcc
AVR_OBJCOPY = avr-objcopy
ARDUINODIR = /usr/share/arduino
LIBRARY = $(ARDUINODIR)/libraries
COREDIR = $(ARDUINODIR)/hardware/arduino/cores/arduino

SERIALPORT=/dev/ttyUSB0

ARDUINODIR = /usr/share/arduino

CFLAGS = -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=100

LIBS =
#LIBS += $(LIBRARY)/EEPROM/EEPROM.cpp
#LIBS += $(LIBRARY)/Ethernet/Dhcp.cpp
#LIBS += $(LIBRARY)/Ethernet/Dns.cpp
#LIBS += $(LIBRARY)/Ethernet/EthernetClient.cpp
#LIBS += $(LIBRARY)/Ethernet/Ethernet.cpp
#LIBS += $(LIBRARY)/Ethernet/EthernetServer.cpp
#LIBS += $(LIBRARY)/Ethernet/EthernetUdp.cpp
#LIBS += $(LIBRARY)/Firmata/Firmata.cpp
LIBS += $(LIBRARY)/LiquidCrystal/LiquidCrystal.cpp
#LIBS += $(LIBRARY)/SD/File.cpp
#LIBS += $(LIBRARY)/SD/SD.cpp
#LIBS += $(LIBRARY)/Servo/Servo.cpp
#LIBS += $(LIBRARY)/SoftwareSerial/SoftwareSerial.cpp
#LIBS += $(LIBRARY)/SPI/SPI.cpp
#LIBS += $(LIBRARY)/Stepper/Stepper.cpp
LIBS += $(LIBRARY)/Wire/Wire.cpp
LIBS += $(LIBRARY)/Wire/utility/twi.c
LIBS += Timer/Timer.cpp
LIBS += Timer/Event.cpp
LIBS += OneWire/OneWire.cpp

#LIBS += LiquidCrystal/LiquidCrystal.cpp

OUTFILE = lcd1
SRCFILES = lcd1.cpp

CFLAGS += -I$(COREDIR)
CFLAGS += -I$(ARDUINODIR)/hardware/arduino/variants/standard
CFLAGS += $(foreach l,$(LIBS), -I$(shell dirname $(l)))

LDFLAGS = -lm

COREFILES = wiring_pulse.c wiring.c wiring_shift.c WInterrupts.c wiring_digital.c wiring_analog.c USBCore.cpp IPAddress.cpp Stream.cpp main.cpp HardwareSerial.cpp Print.cpp WMath.cpp Tone.cpp CDC.cpp new.cpp HID.cpp WString.cpp

OBJS = 

define BUILD
$(1): $(2)
ifeq ($(suffix $(2)),.c)
	$$(AVR_GCC) -c $$(CFLAGS) -o $$@ $$^
else
	$$(AVR_GPP) -c $$(CFLAGS) -o $$@ $$^
endif

OBJS += $(1)
endef

$(foreach l,$(LIBS),$(eval $(call BUILD,core/$(shell basename $(l)).o,$(l))))

$(foreach l,$(COREFILES),$(eval $(call BUILD,core/$(shell basename $(l)).o,$(COREDIR)/$(l))))

$(foreach l,$(SRCFILES),$(eval $(call BUILD,$(l).o,$(l))))

.PHONY: all
.DEFAULT:

all: $(OUTFILE).elf $(OUTFILE).eep $(OUTFILE).hex

$(OUTFILE).elf: $(OBJS)
	$(AVR_GCC) -Os -Wl,--gc-sections -mmcu=atmega328p -o $@ $^ $(LDFLAGS)

$(OUTFILE).eep: $(OUTFILE).elf
	$(AVR_OBJCOPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $^ $@

$(OUTFILE).hex: $(OUTFILE).elf
	$(AVR_OBJCOPY) -O ihex -R .eeprom $^ $@

.PHONY: clean

clean:
	rm -f *.o  *.epp *.elf *.hex

distclean:
	rm -f core/*.o

flash: $(OUTFILE).hex
	$(ARDUINODIR)/hardware/tools/avrdude -C$(ARDUINODIR)/hardware/tools/avrdude.conf -v -patmega328p -carduino -P$(SERIALPORT) -b57600 -D -Uflash:w:$(OUTFILE).hex:i

Treba promeniti OUTFILE i SRCFILES (naši sourcevi), kao i u linijama sa LIBS enablovati sistemske i lokalne biblioteke.

I u source (osim što nije .pde ekstenzija) treba dodati

#include <Arduino.h>

Kompajliranje:

make all

flashovanje

make flash

Napomena: parametri u fajlu su za atmega328p 16Mhz baziranim arduinom.

dl: Makefile

Posted in elektronika, linux | Tagged , , , , | Leave a comment

MikroTik config archiver

Sve treba backupovati, a pogotovo configuracije bitnih uredjaja u mreži. Usput je lepo ako se ima istorijat promena. Što odmah sugeriše neki sistem za cuvanja revizija (cvs, svn, git – izbor u ovom slučaju) 🙂 Programerima su vrlo poznati, nadam se da i većina administratora u dobroj meri poznaje i koristi takve alatke. Sve to naravno ima smisla ako je konfiguracija običan text fajl, što u slučaju MikroTika je tako.

Scripta napisana pre 4-5 meseci, ali se pojavio problem da “ssh uredjaj /export” ne radi kad se scripta pokrene kao cron task. Što faktički znači da bi morala da radi iz neke screen sesije ili da se ručno pokreće, što je skoro ne prihvatljivo za ovako jednostavnu i malu scriptu. Ali danas mi Pedja Supurovic predloži rešenje za problem, tako sad može da funkcioniše kako treba. Postoji mali side efekat sa rešenjem, a to je da scripta mora da se kaci na user koji ima full privilegije na MT, za originalno rešenje je bio dovoljan read access…

scripta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
 
declare -A ROUTERS
ROUTERS[ruter-1-1]="backup@192.168.1.1"
ROUTERS[ruter-2-1]="backup@192.168.2.1"
ROUTERS[ruter-3-1]="backup@192.168.3.1"
DSAKEY="mt_archiver"
 
cd $(dirname $0)
 
if [ ! -d .git ]; then
	git init .
fi
 
if [ ! -f .gitignore ]; then
	echo "*.tmp" >> .gitignore
	git add .gitignore
fi
 
git add $(basename $0)
 
for ROUTER in "${!ROUTERS[@]}"; do
	ssh -i $DSAKEY ${ROUTERS[$ROUTER]} /export file=bkpcfg && (
		scp -i $DSAKEY ${ROUTERS[$ROUTER]}:bkpcfg.rsc ${ROUTER}.cfg.tmp && (
			cat ${ROUTER}.cfg.tmp | tail -n +2 > ${ROUTER}.cfg
			git add ${ROUTER}.cfg
		)
	)
done
 
git diff --cached  | cat
 
date | git commit -a -F- > /dev/null 2>&1

Potrebno je napraviti ssh par ključeva (imenovati mt_archiver, ili več u scripti dati putanju do postojećeg ključa). Podesiti pristup ruterima. I srediti listu uredjaja. Scripta razlike u odnosu na prethodnu verziju printa na stdout-u, pa ako primate mailove od crona, uvek kad se desi neki problem (nedostupan uredjaj) ili se pojavi promena u kofiguraciji na mail će vam stići diff -u 🙂

Posted in linux, network | Tagged , , , , , , , | Leave a comment

Detekcija mreze u kojoj ste

Ponekad nam je u scriptama potrebno znati u kojoj smo mrezi, da li smo sa laptopom kod kuce, na poslu ili u kafiću. Detekcija nije previshe komplikovana, ali ako želimo proveriti sve mogućnosti onda to već nije jedna komanda. Sa WIFIem je relativno jednostavno ali ako detektujete i ethernet konekciju onda to još dodatko komplikuje situaciju.

Meni je pre jednog godinu dana bilo potrebno da mogu da radim predprocesiranje ssh config fajla kako bih mogao da podesim IP adrese servera zavisno da li sam u LANu u jednoj firmi ili u drugoj ili kod kuće. Pa sam napakovao scriptu koja pokušava da detektuje sve situacije i korisniku dostavi jednostavan string iz koga grepom može da proveri skoro sve mogucnosti u samo par linija.

#!/bin/bash

# Fake ifupdown environment
export IFACE="$1"
export LOGICAL="$1"

[ "$2" != 'up' ] && exit 0

[ "$IFACE" != "lo" ] || exit 0

(

IPADDR=$(/sbin/ifconfig $IFACE | sed -e '/inet addr:/!d;s/^.*inet addr:\([0-9\.]\+\) .*$/\1/')

ESSID=$(/sbin/iwconfig $IFACE 2> /dev/null | sed -e '/ESSID:/!d;s/^.*ESSID:"\([^"]*\)".*$/\1/')

APMAC=$(/sbin/iwconfig $IFACE 2> /dev/null | sed -e '/Access Point:/!d;s/^.*Access Point:\s*\(.*\)\s*$/\1/' -e 's/\s*$//' | tr 'A-Z' 'a-z')

GATEWAY=$(/sbin/route -n | egrep '^0\.0\.\0\.0 ' | sed -e 's/ \+/ /g' | cut -d ' ' -f 2)

GATEWAYMAC=""

if ping -n -w 3 -c 3 $GATEWAY > /dev/null 2>&1; then
GATEWAYMAC=$(/usr/sbin/arp -n $GATEWAY | tail -1 | sed -e 's/ \+/ /g' | cut -d ' ' -f 3 | sed -e '/^[A-Za-z0-9:]\+$/!d' | tr 'A-Z' 'a-z')
fi

CONNPARM=";IPADDR=${IPADDR};ESSID=${ESSID};APMAC=${APMAC};GATEWAY=${GATEWAY};GATEWAYMAC=${GATEWAYMAC};"

sudo -u zsteva bash -c "echo '${CONNPARM}' > /home/zsteva/.connparam"
) &

exit 0

U liniji sudo -u treba zameniti svoj username i lokaciju gde će nam se nalaziti connparam fajl, u kojem će biti snimljeni parametri koje kasnije možemo gde god nam je potrebno da iskoristimo. A samu scriptu postaviti u /etc/NetworkManager/dispatcher.d/ kako bi je NetworkManager pozvao kad se nakačimo na neku mrežu.

U .connparam fajlu završi linija nalik:

;IPADDR=192.168.1.152;ESSID=HG532e-1EFF19;APMAC=4c:8b:ef:06:d9:d8;GATEWAY=192.168.1.1;GATEWAYMAC=4c:8b:ef:06:d9:d2;

Običnim case blokom u bash-u možemo proveriti bilo koji elemenat u ovoj liniji i tako prepoznati mrežu u kojoj smo.

Primer:
CONNPARAM=$(cat ~/.connparam)

(
case "$CONNPARAM" in
*\;ESSID=wifi.yyy\;*)
echo "#define LOC_LOC4 1"
echo "#define LOC_LOC5 1"
;;
*\;ESSID=wifi.xxx\;*)
echo "#define LOC_LOC1 1"
;;
*\;GATEWAYMAC=11:22:33:44:55:66\;*)
echo "#define LOC_LOC2 1"
;;
esac
cat ~/.ssh/config_template
) | cpp > ~/.ssh/config

Ovo je primer kojim predprocesiram ssh config template fajl.

Posted in linux | Tagged , , , | Leave a comment

selidba serverske LAN mreze

Potrebno je preseliti deo servera, koji su svi u okviru jedne C mreze na novu lokaciju. Bez promene IP adresa i da odredjeno vreme sve transparentno radi bez obzira na kojoj lokaciji je server. Bilo da je rec o komunikaciji server – server ili korisnici – server. Saobracaj treba da se rutira, bridgovanje nije opcija.

Diagram:

Simulacija: 4 KVM virtualne mashine, virtualne mreze izmedju njih.

Sve to lepo radi, samo kako ovo podesiti da se rute dinamicki prave (neki od protokola za dinamicko rutiranja)?

Posted in linux, network | Tagged , , , , | Leave a comment

Poslednji argument prethodne komandne linije bash

Primer, korpirate više fajlova u neki direktorijum:

cp file1 file2 file3 file4 /var/www/nekidir/pa-jos-neki/pa-jos

i onda skontate da treba i file5, ok cp file5 ali sad treba opet upisati putanju.

E pa ima lakše rešenje:

cp file5 Alt-.

(Alt i tačka) Naravno ovo može da bude neka druga kombinacija zavisno od vaših podešavanja.

Izvor stackoverflow

PS: naravno ako koristite bash kao shell

Posted in linux | Tagged , , , , | 1 Comment

Test img

image

Posted in Uncategorized | Leave a comment

mapiranje “naših” slova na alt_gr

Davnih dana sam koristio Xmodmap koji je naša (slova koja ne postoje na US tastaturi) mapirao tamo gde treba da budu ali sa desnim altom. Pošto 99% vremena koristim US raspored (ne lome mi se prsti za interpunkciju koja mi mnogo češće treba nego šđčćž, a prebacivanje na našu tastaturu mi opet ukine neka US slova koja mi trebaju čak i kad pišem blog post na srpskom…). Malopre napravih takvu mapu, pošto orignalnu sam izgubio ko zna kad davno.


keycode 34 = bracketleft braceleft scaron Scaron
keycode 35 = bracketright braceright dstroke Dstroke
keycode 47 = semicolon colon ccaron Ccaron
keycode 48 = apostrophe quotedbl cacute Cacute
keycode 51 = backslash bar zcaron Zcaron

keysym Alt_R = Mode_switch

Posted in linux | Tagged , , , , | 2 Comments

rutiranje kroz microsoft vpn

Ako putem windows VPN klienta pristupate mreže na poslu, po defaultu podešavanjima enablovan je default gateway kroz VPN tunel. Ali u većini slučajeva VPN server ne dozvoljava da ga koristite za rutiranje ka internetu, pa dolazite u situaciju da vam internet pristup ne radi dok je VPN aktiviran (web, mail, skype).

Rešenje problema je u disablovanju default gatewaya na VPNu i ručno podešavanje ruta kad se tunel podigne (možda može i automatski ali ja ne znam kako).

Diablovanje default gatewaya: Desno dugme na konekciju pa Properties, pa tab Networking, pa selektujete Internet Protocol (TCP/IP), kliknete Properties, kliknete Advanced i dechekirate Use default gateway on remote network. Zatim prihvatite sve sa OK, OK, OK.

Po konektovanju na server još je potrebno napraviti mali cmd fajl koji dodaje rute i koji ćemo pokratati svaki put posle konektovanja na udaljenu mrežu.

Komandom:


ipconfig /all

Treba da potražimo deo u kome piše WAP (PPP/SLIP) Inteface i ispod da pročatamo koja nam je ip adresa.

Potom ako je potrebno da pristupamo mašinama koje su na 192.168.11.0/24 mreži, treba dodati.


route add 192.168.11.0 mask 255.255.255.0 192.168.21.11

192.168.21.11 je IP adresa koju smo pročitali iz gornje komande.

Posted in network, windows | Tagged , , , , | Leave a comment

Slanje zvuka na zvučnike drugog racunara

(Uh, kakav naslov…)

Scenario: Ležite u krevetu sa laptopom, i poželite da muziku koju ste pustili upravo na youtubeu čujete na zvučnicima koji su priključeni za desktop racunar. Naravno ako su oba racunara linux mašine koje koriste pulseaudio možete uraditi redirekciju zvuka sa lokalne mašine na drugu 😉

Na mašini gde su zvučnici potrebno je uraditi (ja sam se ulogovao preko SSHa, naravno na tok mashini treba da ste ulogovani pod istim tim userom da bi se podigao pulseaudio):


pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1\;192.168.0.0/16 auth-anonymous=1

Ovim smo podesili modul da se zvuk može prihvatiti putem TCPa i to sa svih hostova na 192.168.x.x bez autorizacije. (Naravno ako imate firewall potrebno je i na njemu dozvoliti.)

Na lokalnom računaru (laptopu u krevetu):


pax11publish -e -S IP_OD_MASHINE_GDE_SU_ZVUCNICI

I posle stopiranja i puštanja novog strema (reload youtube pagea) muzika kreće iz zvučnika sa druge mašine.


pax11publish -e -r

Vraća zvuk na lokalne zvučnike.

Posted in linux | Tagged , , , | Leave a comment

Pracenje prometa odlazne konekcije

Pracenje prometa odlazne konekcije ka odredjenoj IP (AA.BB.CC.DD) i porta PORT.


sudo /sbin/iptables -t filter -A OUTPUT -p tcp -d AA.BB.CC.DD --dport PORT -j ACCEPT


sudo /sbin/iptables -L -v -x -n | grep 'tcp dpt:PORT' | grep AA.BB.CC.DD | sed -e 's/ \+/ /g' -e 's/^ //' -e 's/ .*$//'

Vraca broj paketa koji su preneti.

Posted in linux | Tagged , , , | Leave a comment