ESP32, Steppermotorer og Dollies – Work in progress, expect updates – dog ikke så ofte

For noen år tilbake, trålet jeg som alltid Finn.no. Der snublet jeg over en ganske snasen manuell Dolly til en fornuftig penge.

Etter litt googling fant man ut at denne kunne utstyres med kontroller som gjorde det mulig å kjøre denne dollyen med motor. Men med både motor og kontroller – men da ble prisen vesentlig høyere. Men motoren alene var ikke så dyr.

Som en som raskt tenker «hvor vanskelig kan det være», kjøpe sporenstreks inn steppermotor og brakett fra leverandøren. I tillegg ble det kjøpt inn en stepper kontrollkort – og der har det ligget siden.
Hva er vel bedre enn å børste støv av et slikt prosjekt?

Steppermotor:
Motoren er av typen 17HS15-1684S-PG27X (datablad)
Det er en bipolar motor, med 1.8 grader pr step, og kan trekke 1.68Ampere pr fase. 1,8 grader betyr 200 step pr runde.

Stepperkontroller:
Kontrollerkortet var et DRV8825 fra Pololu (lenke).
I følge skjemaet på produsentens nettside burde det være grei skuring å koble sammen dette

Det ser ut til å være mulig å kjøre microstep ved å benytte M0-M2, så disse bør jeg koble opp.

Strømgrense
Etter å ha sett litt dokumentasjon på 8825-kortet, står det at man skal justere strømgrensen. Motoren kan trekk 1.68A pr fase, mens 8825 kan kun levere 1.5A med kjøling mens kun 1.2 uten. Jeg tenker uansett jeg justerer strømgrensen ned til 1.2A

Formelen for å finne korrekt vref er definert på pololu sine nettsider, men for 8825 er formelen limit = vref *2. Som betyr at jeg skal justere vref til 0.6V for å sette en grense på 1.2A.

 

https://youtu.be/89BHS9hfSUk

 

Andre grensesnitt:
En timelapse-rigg må jo også støtte kameratilkobling. I et tidligere prosjekt har jeg lekt meg med å trigge kamera fra en Arduino med en optocoupler som legger kamera-selvutløseren til jord. Dette har fungert tidligere, og jeg tenker at det vil fungere greit også i dette scenarioet.

Valg av mikrokontroller:
Jeg har jobbet en del med ESP8266, og har begynt å bli godt kjent med dette kortet. Dog har den et begrenset sett med GPIO tilgjengelig. Konseptuelt ser jeg for meg at jeg må ha kunne bruke 9 samtidige GPIO pinner. 7 til stepper-kontroller, samt 2 til kameratrigging. Denne videoen går i gjennom hvilke pinner som er tilgjengelig i hver av kortene

https://youtu.be/7h2bE2vNoaY

Det vil da være naturlig å se på en ESP32

Diagram

Edit: R1 og R2 må sløyfes. Det oppnås ikke høy nok spenning på optoisolatorene med 220 ohms resistor i serie. 

Kretskort:
Jeg syns ikke dette så ut som noe jeg ønsker prototype på vero-board, så jeg bestiller et printkort.

To-lags kort, Gul er banene på ene siden, mens orange på andre siden. Fant ikke noe fint silkscreen til kontrollerkortet.

Kode
For å gjøre prosjektet overkommelig deler jeg det opp i tre hovedbolker.
Steppermotor-kontroll
Kamerastyring
UI

La oss starte med test av steppermotoren.

En rask kodesnutt basert på flere andre kilder på nett, så endte jeg opp med denne;

//kjører steppermotor 40000 step før den snur og kjører tilbake 4000
//step. Gjenta fra toppen.
//Trykker du på boot-knappen på ESP32 vil den også snu, og kjøre
//40k stepp fra der den snur.

#include <Button.h> #define dirPin 26 #define stepPin 25 #define resetPin 32 #define enablePin 33 #define MS1 18 #define MS2 17 #define MS3 16 Button bootButton(0); int totalSteps = 0; int idirection = 1; void setup() { Serial.begin(9600); bootButton.begin(); pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(resetPin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(MS2, OUTPUT); digitalWrite(dirPin, idirection); digitalWrite(resetPin, HIGH); digitalWrite(enablePin, HIGH); digitalWrite(MS1, LOW); digitalWrite(MS2, LOW); digitalWrite(MS3, LOW); } void loop() { totalSteps++; digitalWrite(stepPin, HIGH); delayMicroseconds(500); digitalWrite(stepPin, LOW); delayMicroseconds(500); if (bootButton.pressed()){ Serial.println("Button 1 pressed"); Serial.println(totalSteps); toggle(); } if (totalSteps == 40000){ toggle(); } } void toggle(){ totalSteps = 0; if (idirection == 0){ idirection = 1; } else { idirection = 0; } digitalWrite(dirPin, idirection); }

På grunn av gearkassen koblet på steppermotoren, trenger den hele 40k stepp for å komme fra en side av dollyen til den andre. 

//fokuserer, trigger shutter - repeat

#define focusPin 2 #define shutterPin 4 void setup() { // Declare pins as output: Serial.begin(9600); pinMode(focusPin, OUTPUT); pinMode(shutterPin, OUTPUT); } void loop() { delay(5000); Serial.println("focus"); digitalWrite(focusPin, HIGH); delay(5000); Serial.println("shutter"); digitalWrite(shutterPin, HIGH); delay(5000); digitalWrite(focusPin, LOW); digitalWrite(shutterPin, LOW); }

 

 

 

Skrevet i Uncategorized | Kommentarer er skrudd av for ESP32, Steppermotorer og Dollies – Work in progress, expect updates – dog ikke så ofte

MQTT basert gjæringskontroll for Craftbeer Pi

Etter et par år med lua og esp8266, flytter jeg meg over i Arduino-verden igjen, det vil si – esp8266 addonen for Arduino IDE

Det finnes vesentlig flere bibliotek og større community for Arduino kode, så – intet alvorligere bak.

I de senere månedene har vi arbeidet met MQTT på jobben, så – det var naturlig for meg å benytte denne tankegangen når jeg skulle oppgradere gjæringsskapet.

//craftbeerpi mqtt fermentation chamber controller, heavily based on Erick Joaquins MQTT switch code.
//modified for cbpi json payload, heater/cooler and publishing of temperature
//
//Requires PubSubClient found here: https://github.com/knolleary/pubsubclient
//



#include #include
#include
#include
#include



void callback(char* topic, byte* payload, unsigned int length);



//EDIT THESE LINES TO MATCH YOUR SETUP



#define MQTT_SERVER "127.0.0.1" //you MQTT IP Address
const char* ssid = "replace";
const char* password = "replace";



//EJ: Data PIN Assignment on WEMOS D1 R2 https://www.wemos.cc/product/d1.html
// if you are using Arduino UNO, you will need to change the "D1 ~ D4" with the corresponding UNO DATA pin number



const int switchPin1 = D1;
const int switchPin2 = D5;
#define OWBUS D7



//onewire setup for temperature sensor
OneWire oneWire(OWBUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempsens;



//timer for posting temperature data - time in milliseconds
unsigned long interval = 500;
unsigned long previousMillis = 0;
unsigned long currentMillis = millis();



//buffer for handling json payloads
StaticJsonBuffer<200>; jsonBuffer;



//EJ: These are the MQTT Topic that will be used to manage the state of Relays, change for your settings



char const* switchTopic1 = "home/brewery/bay1/cool";
char const* switchTopic2 = "home/brewery/bay1/heat";



//misc



WiFiClient wifiClient;



PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);



void setup_sensors(){
sensors.begin();
//Serial.println(sensors.getDeviceCount(), DEC);
if (!sensors.getAddress(tempsens, 0)) Serial.println("Unable to find address for Device 0");
sensors.setResolution(tempsens, 10);
}



void setup() {
//initialize the switch as an output and set to HIGH (off)
pinMode(switchPin1, OUTPUT); // Relay Switch 1
digitalWrite(switchPin1, HIGH);
pinMode(switchPin2, OUTPUT); // Relay Switch 2
digitalWrite(switchPin2, HIGH);



ArduinoOTA.setHostname("My Arduino WEMO"); // A name given to your ESP8266 module when discovering it as a port in ARDUINO IDE
ArduinoOTA.begin(); // OTA initialization



//start the serial line for debugging
Serial.begin(115200);
delay(100);



//start wifi subsystem
WiFi.begin(ssid, password);
//attempt to connect to the WIFI network and then connect to the MQTT server
reconnect();
delay(100);
setup_sensors();
//wait a bit before starting the main loop
delay(2000);
}



void loop(){
currentMillis = millis();
//reconnect if connection is lost
if (!client.connected() && WiFi.status() == 3) {reconnect();}



//maintain MQTT connection
client.loop();
//MUST delay to allow ESP8266 WIFI functions to run
delay(10);
ArduinoOTA.handle();
if ((currentMillis - previousMillis) >= interval) {
postTemp();
previousMillis = currentMillis;
}
}



void postTemp(){
sensors.requestTemperatures();
float tempC = sensors.getTempC(tempsens);
Serial.print("caling ");
Serial.println(String(tempC).c_str());
client.publish("home/brewery/bay1/temperature", String(tempC).c_str(), false);
}



void callback(char* topic, byte* payload, unsigned int length) {
//convert topic to string to make it easier to work with
String topicStr = topic;
//EJ: Note: the "topic" value gets overwritten everytime it receives confirmation (callback) message from MQTT
//Print out some debugging info
Serial.println("Callback update.");
Serial.print("Topic: ");
Serial.println(topicStr);
Serial.println((char *)payload);



if (topicStr == "home/brewery/bay1/cool") {
String state = jsonState(payload);
Serial.println((char *)payload);
if(state == "on") {
digitalWrite(switchPin1, LOW);
client.publish("home/brewery/bay1/coolConfirm", "1");
}
else if (state == "off") {
digitalWrite(switchPin1, HIGH);
client.publish("home/brewery/bay1/coolConfirm", "0");
}
}
else if (topicStr == "home/brewery/bay1/heat"){
String state = jsonState(payload);
if(state == "on") {
digitalWrite(switchPin2, LOW);
client.publish("home/brewery/bay1/heatConfirm", "1");
}
else if (state == "off") {
digitalWrite(switchPin2, HIGH);
client.publish("home/brewery/bay1/heatConfirm", "0");
}
}
jsonBuffer.clear();
}



void reconnect() {



//attempt to connect to the wifi if connection is lost
if(WiFi.status() != WL_CONNECTED){
//debug printing
Serial.print("Connecting to ");
Serial.println(ssid);



//loop while we wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}



//print out some more debug once connected
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}



//make sure we are connected to WIFI before attemping to reconnect to MQTT
if(WiFi.status() == WL_CONNECTED){
// Loop until we're reconnected to the MQTT server
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");



// Generate client name based on MAC address and last 8 bits of microsecond counter
String clientName;
clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);



//if connected, subscribe to the topic(s) we want to be notified about
//EJ: Delete "mqtt_username", and "mqtt_password" here if you are not using any
if (client.connect((char*) clientName.c_str(),"user", "pass")) { //EJ: Update accordingly with your MQTT account
Serial.print("\tMQTT Connected");
client.subscribe(switchTopic1);
client.subscribe(switchTopic2);
//EJ: Do not forget to replicate the above line if you will have more than the above number of relay switches
}



//otherwise print failed for debugging
else{Serial.println("\tFailed."); abort();}
}
}
}



//generate unique name from MAC addr
String macToStr(const uint8_t* mac){



String result;



for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);



if (i < 5){
result += ':';
}
}



return result;
}




String jsonState(byte* payload) {
JsonObject& root = jsonBuffer.parseObject(payload);
if (!root.success()) {
Serial.println("parseObject() failed");
}
return root["state"];
}
Skrevet i Øl, Tech | Kommentarer er skrudd av for MQTT basert gjæringskontroll for Craftbeer Pi

Globalsat DG-200 tool / datacenter

Ok, Globalsat seems to have removed more or less any trace of the setup/download software for their GPS-logger DG-200 from the web.

Creative use of google cache and the internet archive – I managed to get a hold of the the setup.

For other people looking for this, it’s available for download here.

GlobalSat – DG-200 Tool-Setup_1401211.

searchterms:

Globalsat DG-200 setup tool datacenter.zip

GlobalSat – DG-200 Tool-Setup_1401211.exe

GlobalSat – DG-200 Tool-Setup_1401211.zip

 

 

Skrevet i Software, Tech | Kommentarer er skrudd av for Globalsat DG-200 tool / datacenter

Hjemmelaget temperaturkontroll for gjæringsskap

Så – som nevt i et tidligere innlegg har jeg bygget en provisorisk temperaturkontroll for gjæringsskapet mitt.

Den gjør vel omtrent havlparten av jobben som en STC-1000 gjør, og koster mer å bygge pluss at man må ha en apache/mysql-server stående, men det har vi vel alle?

Riggen betår av

1 stk NodeMCU fra Kjell & Co
1 stk ds18b20 1-wire temperatursensor
1 stk relekort 10A250V, for eksempel dette – selv gikk jeg for 2 releer, da det sørget for to-fase brudd i varmekildens strømtilførstel.

NodeMCU må settes opp mot nettverk, dette kan gjøres på flere måter, men jeg valgte å sette den opp som en klient med statisk ip, uten DNS.

Filnavn: networking.lua

--connect network
wifi.setmode(wifi.STATION)
wifi.sta.config("din ssid","ditt wpa2 passord")
wifi.sta.setip({ip="ip-adresse",netmask="subnet-maske",gateway="gateway-adresse"})

I tillegg fant jeg et bibliotekskrevet av Peter Scargill som håndterte ett stk ds18b20-sensor uten noe hassle

Filnavn: ds18b20.lua

--------------------------------------------------------------------------------
-- DS18B20 one wire module for NODEMCU
-- LICENCE: http://opensource.org/licenses/MIT
-- Vowstar <vowstar@nodemcu.com>
-- Dramatic simplification: Peter Scargill
--------------------------------------------------------------------------------

-- Set module name as parameter of require
local modname = ...
local M = {}
_G[modname] = M
--------------------------------------------------------------------------------
-- Local used modules
--------------------------------------------------------------------------------
-- Table module
local table = table
-- String module
local string = string
-- One wire module
local ow = ow
-- Timer module
local tmr = tmr
-- Limited to local environment
setfenv(1,M)
--------------------------------------------------------------------------------
-- Implementation – you don’t get any shorter than this
--------------------------------------------------------------------------------

function readNumber(pin)
ow.setup(pin)
ow.reset(pin)
ow.write(pin, 0xCC, 1)
ow.write(pin, 0xBE, 1)
data = nil
data = ""
for i = 1, 2 do
data = data .. string.char(ow.read(pin))
end
t = (data:byte(1) + data:byte(2) * 256) / 16
if (t>100) then
t=t-4096
end
ow.reset(pin)
ow.write(pin,0xcc,1)
ow.write(pin, 0x44,1)
return t
end

-- Return module table
return M

Serverside laget jeg en php som returnerte <maxtemp> og <mintemp> i en særs forenklet xml – jeg kalte den for reg.php

reg.php har også fuksjonaliteten som poster currentTemp til mySQL-basen beer og tabellen dataLogger

filnavn reg.php

<?php

$scurrTemp = $_GET['currTemp'];
$srelayState = $_GET['relayState'];
$sqlServer = "localhost";
$sqlUser = "username"; //byttes ut med din mysql bruker
$sqlDB = "beer";

//koble til databaseserver
$dbhandle = mysql_connect($sqlServer, $sqlUser,"mypassword")
 or die("Klarte ikke koble til $sqlServer");

// Koble til riktig database
$selected = mysql_select_db($sqlDB, $dbhandle)
 or die("Klarte ikke åpne $sqlDB");

$sql = "INSERT INTO datalogger (currTemp, relayState) VALUES(".$scurrTemp.",".$srelayState.")";

mysql_query($sql);
echo "<maxtemp>28</maxtemp>";
echo "<mintemp>26</mintemp>"

?>

datalogger-tabellen ser slik ut

mysql> describe datalogger;
+-------------+--------------+------+-----+-------------------+----------------+
| Field       | Type         | Null | Key | Default           |          Extra |
+-------------+--------------+------+-----+-------------------+----------------+
| id          | int(11)      | NO   | PRI | NULL              | auto_increment |
| currTemp    | decimal(7,4) | NO   |     | NULL              |                |
| relayState  | int(1)       | NO   |     | NULL              |                |
| tidsstempel | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+--------------+------+-----+-------------------+----------------+

Også til slutt lua-koden for polling og posting av temperatur.
Det er nok sikkert veldig tydelig at lua ikke er et språk jeg påstår jeg behersker.

Filnavn; beercontrol13.lua

--- Beercontroller by tdegerdalen
--- version 0.13
--- uses ds18b20.lua by Peter Scargill 
--- uses networking.lua to configure wifi and static ip
---
--- todo: relaybug at startup (see below)
--- todo2: enable more sensors and average between them
---
---
--- note; to avoid memory issues this script should be compiled before run

maxTemp = 20
minTemp = 18
currTemp = 0
relayState = 0

--define pin for one 1-wire dallas tempsensor.
sensorPin = 7

--define pins to control relay, set them to output
--relay module attached kicks in when pulled low
--bug: relay kicks in a few millisecs at boot - might fix it witch capacitator

relay1pin = 3
relay2pin = 4
gpio.mode(relay1pin,gpio.OUTPUT)
gpio.mode(relay2pin,gpio.OUTPUT)
gpio.write(relay1pin,gpio.HIGH)
gpio.write(relay2pin,gpio.HIGH)


--- triggers
--- every 5 seconds, poll tempsensor
--- every 30 seconds, post to net and get temperature thresholds

tmr.alarm(1, 5000, 1, function() pollTemp() end )
tmr.alarm(2, 30000, 1, function() postData() end )

--- functions below

function pollTemp()
 t=require("ds18b20") 
 currTemp = t.readNumber(sensorPin)
 print(currTemp) 
 print("maxtemp", maxTemp)
 if currTemp > maxTemp and relayState == 1 then
 relayOff()
 end
 if currTemp < minTemp and relayState == 0 and currTemp ~= -0.0625 then
 relayOn()
 end
 if currTemp == -0.0625 then
 relayOff()
 end
 t = nil 
 ds18b20 = nil 
 package.loaded["ds18b20"]=nil
end

function postData()
 conn=net.createConnection(net.TCP, 0) 
 conn:on("connection",function(conn, payload)
 conn:send("GET /beer/reg.php?currTemp="..currTemp.."&relayState="..relayState.." HTTP/1.1\r\n".. 
 "Host: 10.0.0.2\r\n"..
 "Accept: */*\r\n"..
 "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
 "\r\n\r\n") 
 end)
 
 conn:on("receive", function(conn, payload)
 tStreng,maxTempStart = string.find(payload,"<maxtemp>")
 maxTempEnd, tStreing = string.find(payload,"</maxtemp>")
 maxTempStart = maxTempStart + 1
 maxTempEnd = maxTempEnd - 1
 
 maxTempDeg = string.sub(payload, maxTempStart, maxTempEnd)

 tStreng,minTempStart = string.find(payload,"<mintemp>")
 minTempEnd, tStreing = string.find(payload,"</mintemp>")
 minTempStart = minTempStart + 1
 minTempEnd = minTempEnd -1
 minTempDeg = string.sub(payload, minTempStart, minTempEnd)

 print(minTempDeg, maxTempDeg)
 maxTemp = tonumber(maxTempDeg)
 minTemp = tonumber(minTempDeg)
 maxTempDeg = nil
 minTempDeg = nil
 conn:close()
 end)
 
 conn:connect(80,'10.0.0.2') 
end

function relayOn()
 relayState = 1
 print("RelayOn")
 gpio.write(relay1pin,gpio.LOW)
 gpio.write(relay2pin,gpio.LOW)
end

function relayOff()
 relayState=0
 print("RelayOff")
 gpio.write(relay1pin,gpio.HIGH)
 gpio.write(relay2pin,gpio.HIGH)
end
Skrevet i Øl, Tech | Kommentarer er skrudd av for Hjemmelaget temperaturkontroll for gjæringsskap

Brygg 2 – Pils

Som brygg to tenkte jeg å prøve meg på en undergjæret pilser.

Jeg besøkte Bryggeland på Strømmen og kjøpte meg et sirups-kit fra Coopers – Thomas Coopers 86 Days pilsner. Dama i kassa kunne mersalg, så jeg fikk med et par pakker «bedre gjær», maltblanding samt et hydrometer.

Ingredienser

Fremgangsmåte

Sikker på mine kunnskaper etter forrige runde med IPA, hoppet jeg bukk over alle anbefalinger og guider som fulgte med fra både bryggeland og Coopers. Jeg brukte følgende fremgangsmåte, så vil det vise seg om det blir bra.

  1. Legg boksen med sirup i varmt vann noen minutter, slik at innholdet blir mer flytende.
  2. Tilsett boksens innhold i gjæringsspann, fyll på et par-tre liter kokende vann.
  3. Fyll så opp til 23 liter med kaldt vann fra springen
  4. Tøm i Spraymalt
  5. Sett på lokket og rist godt, slik at blandingen blander seg.
  6. Ta av lokket, fyll reagensrøret med vørter (blandingen)
  7. Tilsett gjær
  8. Rist litt til
  9. Sett på gjærstopp
  10. Sett til undergjæring (gjæring i kaldt rom ca 8-12 grader)

Brygget ble satt kl 22:30 21.03.2016 – OG ble målt til 1036


Ølet ble flasket og satt til karbonering – 21.04 var dette ferdig.

FG målt til 1012 – dette ble altså et lettøl.

Neste gang – mer spraymalt – OG bør ligge rundt 1050+

 

Skrevet i Øl | Kommentarer er skrudd av for Brygg 2 – Pils

Ølbasill – Setup, Brygg 1

Etter å ha blitt overtalt av en kollega til å teste enkel ølbrygging gikk jeg til innkjøp av minimumskit for brygging av øl.

Det besto av:
2 stk gjæringskar fra Europris
1 stk hevert fra Europris
1 stk gjærlås fra Europris.

I tillegg gikk jeg for et IPA-kit fra St. Peters – også fra Europris

IMG_3956.JPG

I følge min kollega skal slikt gjæres på 18-20 grader, så jeg bygget en provisorisk boks i kjelleren som jeg isolerte og satte inn et varmeelement. Siden jeg har litt arduino-utstyr liggende fra andre prosjekter (som sjelden kommer i mål) laget jeg også en enkel temperaturstyring.

IMG_3967.JPG

Godt renhold er visst alfa og omega når det kommer til ølbrygging. Jeg ble anbefalt å vaske innsiden av gjæringskar og alt annet som skal være i kontakt med brygget med klor og skylle godt.

Vørteren (innholdet i hermetikkboksene St. Peterskittet) ble lagt i varm vann for å «smelte» sirupen i noen minutter, før de ble helt over i gjæringsboks nummer 1. Deretter ble 4 liter kokende vann tilsatt (fra vannkoker) før boksen ble fylt opp til 19 liter med kaldt vann. Lokket ble plassert på karet og jeg ristet det kraftig i ca 5 minutter, slik at det hele blandet seg godt. Gjær og humle ble så tilsatt (alt dette fulgte også med i kittet) og ristet litt til. Gjærlåsen ble fylt med vann og plassert i karets lokk og karet ble satt ned i mitt provisoriske gjæringsskap.

Etter en dag eller to hadde det begynt å «ploppe» som det visstnok heter på fagspråket når det går luft/co2 ut av gjærlåsen.

Jeg hadde litt dårlig magefølelse på arduino-kontrolleren min, så jeg satt meg ned og bygde en ny løsning basert på nodeMCU med logging mot mysql og noe mindre brannfarlige relekoblinger. Legger ut egen artikkel på nodeMCU senere.

IMG_3981.JPG

Brygget fikk stå i 16 dager før det fikk holde. Da hadde ploppingen avtatt ganske mye og jeg antok at gjæreprosessen var ferdig.

Lokket ble fjernet og jeg syntes det hele så relativt udelikat ut, og tenkte med meg selv at brygget nok var blitt forurenset av bakterier/dårlig renohold. Tok et bilde og sendte min bryggekyndige kollega, som kunne berolige meg med at alt så normalt ut

IMG_4007.JPG

Det å få kullsyre inn i ølen skjer etter den er flasket. Dette gjøres med at man lager litt sukkerlake som tilsettes ølen, mer om det i neste avsnitt. Jeg brukte en kalkulator jeg fant på nett for å finne ut hvor mye sukker som skulle tilsettes. Jeg endte vel med ca 40 gram på 19 liter.

Brygget ble ført over i bryggekar 2 ved hjelp av nykloret heverten. Det var viktig å ikke suge med seg slam fra bunnen, ei heller tilføre noe særlig oksygen ved å «splashe» ølen rundt. Jeg overførte ca en liter i første omgang før jeg tilførte sukkerlaken nevnt over. Så fortsatte jeg å overføre og lot ølen virvle og dermed spre skukkerlaken helt til det bare var ca 1 cm igjen i gjæringskar 1. Dette anså jeg som spilløl, da jeg ikke ville risikere å få med gjærrester over i kar 2.

Alt var dermed klart for å flaske

Jeg hadde kvelden i forveien brukt et par timer på å vaske og koke gamle halvliters brusflasker. Disse krympet og ble urunde i bunnen, men det fikk duge. Heverten ble renset med klor nok en gang og flaskene fylt til randen med øl. Når heverten ble fjernet fra flasken, sank nivået til noe er fornuftig. Når jeg skulle skru på korken, klemte jeg på flaskene slik at ølen kom helt på kanten av flasken, for å få ut så mye oksygen fra flaska som mulig.

IMG_4008.JPG

Så var det bare å skru opp temperaturen på gjæringsskapet til 22 grader og la ølen stå og karboneres et par uker, før den dernest ble satt kjølig.

Smaskprøver:
1 uke etter flasking: Markant gjærsmak, beskt – ikke drikkbart
2 uker etter flasking: Ingen gjærsmak, forstatt for beskt.
3 uker etter flasking: Begynner å nærme seg.
TBC

Skrevet i Øl | Merket med , , , , , | Kommentarer er skrudd av for Ølbasill – Setup, Brygg 1

Samsung 8-series remote and Kodi/OSMC keymap on the RPI2

Ok

I´ve been running xbmc/kodi/osmc on the rpi for a few years. Did have a extensive night configuring it in 2013 or 14, and I´ve kept the config while moving between releases – and hardware. I´m now up to the rpi2, and is really pleased.

However, after the sd-card on my rpi2 died, and with no backup of the config I found my self back at square one.

I decided to do it a bit diffrently this time, and to make sure I won´t loose the config again, i´m putting it online.

Filename: ~/.kodi/userdata/keymaps/keymap.xml


  
    
      XBMC.ActivateWindow(Home)
      noop
      ContextMenu
      Info
      FullScreen
      Back
      XBMC.ActivateWindow(Home)
    
  
  
    
      XBMC.Restart()
      XBMC.ActivateWindow(Home)
      ContextMenu
      Info
      FullScreen
      Back
      XBMC.ActivateWindow(Home)
    
  
  
    
      CodecInfo
      SubtitleAlign
      XBMC.ActivateWindow(subtitlesearch)
      NextSubtitle
      FullScreen
      Back
      RunScript(/home/osmc/.kodi/userdata/stopandmain.py)
      Seek(-10)
      Seek(10)
      Seek(30)
      Seek(-30)
    
  
  
    
      PreviousMenu
      BackSpace
    
  
  
    
      Info
    
  
  
    
      Info
      CodecInfo
    
  
  
    
Info
      CodecInfo
    
  
  
    
      Info
      CodecInfo
    
  
  
    
      Info
      CodecInfo
    
  
  
    
      noop
      Back
      noop
    
  
  
    
      noop
      noop
      Back
    
  

when hitting the exit-button while in fullscreen, the pythonscript stopandmain.py is called stopping the playback and returing to the main menu.

Filename: ~/.kodi/userdata/stopandmain.py

#!/usr/bin/python
import xbmc
import xbmcgui
xbmc.executebuiltin("Action(Stop)")
xbmc.executebuiltin( "XBMC.ActivateWindow(Home)" )

Skrevet i Software, Tech, Uncategorized | Merket med , , , | Kommentarer er skrudd av for Samsung 8-series remote and Kodi/OSMC keymap on the RPI2

Kameratrigger, fremdriftsrapport

Så, har ikke hatt så mye tid til hands on med kameratriggeren ennå, men har googlet litt og tenkt litt.

Photoresistoren er definitivt byttet ut med en phototransistor, for å holde hastigheten oppe.
Jeg har handlet inn ir og phototransistor fra Ebay, og koblet dette opp mot en arduino og lest av laserpeker.
Dette fungerte utmerket.

phototransistor_nano

Usikker på om denne transistoren leser for snevert fysisk område, da laserpekeren måtte treffe nøyaktig senter på transistoren for at den skulle registrere. Denne virkemåten er jo perfekt for «tripwire» foto, men neppe lyn.
Jeg skal eksperimentere med andre verdier på R1, se om det gjør nytten.

Tenker muligens å lese nivået på transistoren ved start (og kanskje hver n-te loop) og sette dette til normalen. hvis sensorverdien endrer seg nevneverdig fra dette (justerbar threshold) vil kameraet trigges.

Skrevet i Tech | Merket med , | Kommentarer er skrudd av for Kameratrigger, fremdriftsrapport

Ok – Challenge accepted!

Snublet over MIOPS på Kickstarter i dag.

MIOPS er en fjernutløser for kamera rigget mot forskjellige sensorer, blandt annet lyd og lys.

Jeg har jo allerede en bøtte sensorer og noen arduinoer liggende, så dette må da være noe jeg kan få til selv.

Smørbrødliste:
* Arduino
* Lydsensor (mikrofon, piezo?)
* Fototransistor eller IR-diode (må forskes på)
* Bevegelsesdeteksjon (Bryte IR stråle?, trenger man speil?)
* Display med backlight
* Modus-knapp
* Justeringsknapp (Rotary encoder)
* Kameratilkobling (2.5mm jack?)
* Oppladbart batteri

Oppdatering 03.08.2014
Lekt litt i Fritzing, laget en konseptlayout uten display.
Untitled

Skrevet i Tech | Merket med , | Kommentarer er skrudd av for Ok – Challenge accepted!

Hvordan finne frem til Fagerli?

Det anbefales å benytte fylkesvei 229 fra Bjørkelangen selv om det er noen kilometer lenger enn via 170 / 21

Det er også begrenset med Telenor mobildeking i området, Netcom er ok.
Vi anbefaler at man slår på tråden før man kjører inn på fv 228. Dette vil være ca 10 minutter før ankomst, slik at vi kan møte dere ved bommen.

Bomvegen inn til Fagerli befinner seg 33 km sør for Bjørkelangen på disse koordinatene (oppgitt i forskjellige formater avhengig av gps-type).

59.75150,11.64492
59.75150º N, 11.64492º Ø
59° 45′ 5.4″N, 11° 38′ 41.7″Ø

Klikk for å åpne kart

God gammeldags veibeskrivelse:
* Kjør forbi Shell(?)-stasjonen på venstre hånd på veien mellom Aursmoen og Bjørkelangen, kjør forbi skiltet «Setskog»
* Etter ca 1 km, sving til venstre (Skiltet Ørje/Hemnes)
* Følg denne veien (FV 229) til enden (ca 20 km)
* Ta til venstre (Skiltet Ørje)
* Følg denne veien ca 2 km
* Ta til venstre (Skiltet Setskog/Åserud)
* Nå er det lurt å ringe hvis du har Telenor
* Følg veien i 9 km, ca 11 minutter. Du er nå fremme ved en bomvei ned til høyre

fagerli

Skrevet i Uncategorized | Kommentarer er skrudd av for Hvordan finne frem til Fagerli?