логин: 
<< предыдущая заметкаследующая заметка >>
04 мая 2017
Вдогонку к вчерашнему посту про алгоритмы

Вчерашний пост http://lleo.me/dnevnik/2017/05/03.html про управление мотором собрал множество комментариев - реально горжусь вами, что вы у меня такие умные. Советов оказалось множество, и буквально в пятом комменте некто Лжедмитрий Малобуков дал ссылку на математический алгоритм:
https://stackoverflow.com/questions/22583391/peak-signal-det[...] Который сильно подкупал анимированной гифкой, иллюстрирующей матаппарат. Язык алгоритма правда был незнакомый. Да и математику я, оказывается, сильно подзабыл - средние отклонения там всякие, Мю... Но с помощью PHP я алгоритм воссоздал, и он заработал у меня на тестовом массиве. А Чук, неожиданно заинтересовавшийся проблемой, параллельно накидал его на C. Я его код потом пару раз переписал, в итоге получилось вообще несколько строчек, ниочем, как говорится:

показать код chuk.c

chuk.c

#include <math.h>
#include "chuk.h"

#define FLT_lag        5
#define FLT_TOL        64
#define FLT_THRESHOLD  3.0
#define FLT_INFLUENCE  0.5

int FLT_D[FLT_lag],FLT_fildy; //,FLT_c=0;

static int get_mean(int* buf,int N) { int x=0; for(int i=0; i < N; i++) x += buf[i]; return x/N; }
static int get_stdd(int* buf, int mean, int N) { int x=0; for(int i=0,d;i<N;i++) { d=mean-buf[i]; x+=d*d; } return sqrt(x/N); }

static void FLT_push(int x) { if(FLT_c<FLT_lag) FLT_c++; else { for(int i=1;i<=FLT_lag;i++) FLT_D[i-1]=FLT_D[i]; } FLT_D[FLT_lag]=x; }

int FLT(int x) {
    if(FLT_c < FLT_lag) { FLT_fildy=x; FLT_push(x); return 1; }

    FLT_push(FLT_fildy);
    int mu=get_mean(FLT_D,FLT_lag);

    if(abs(x-mu) <= FLT_THRESHOLD*get_stdd(FLT_D,mu,FLT_lag)) { FLT_fildy=x; return 1; }

    FLT_fildy=((FLT_TOL*FLT_INFLUENCE * x) + (FLT_TOL*(1-FLT_INFLUENCE) * FLT_fildy)) / FLT_TOL;
    return (x > mu) ? 2 : 0;
}


chuk.h

int FLT_c;
int FLT(int x);

Вопреки сомнениям скептиков, этот код исправно работал. Ниже на картинке пара пробегов двухоборотного замка туда и обратно от заедания до заедания:

Эту картинку передает по WiFI чип 8266 в браузер, по аяксу график плавно плывет и достраивается. Красные эпюры - ток мотора, как мы помним. Синяя линия - результат математической оценки по анализу текущего момента: всплески и провалы. Нас, собственно, интересуют всплески. Зеленая линия - идеал: моменты, когда двигается щеколда замка. Как видим, даже малозаметные всплески в нужных местах исправно отмечаются всплесками синей линии, совпадающей с зеленой. Вы наверно спросите, откуда она взялась, зеленая? Ну, честно говоря, у меня в замке все-таки есть кнопка состояния. Она размыкается в момент, когда приподняты железяки, запирающие защелку, и соответственно, идет её движение - выдвигание или убирание (сорри, не помню правильную слесарную терминологию):

Короче, кнопка-то есть. По крайней мере, иногда. Я ее сперва поставил, потом снял, когда понял, что можно мерять токи мотора, сейчас поставил опять, чтобы на графике отображать эталон. Но кнопка мне не нравится, потому что это неспортивно. Ну правда же, на дворе 21 век, все предыдущие века толпы седых математиков думали, карандаши грызли, в безумие впадали, и всё для чего? Чтобы теперь, в век, когда мощный компьютер умещается в чипе ESP8266 размером с ноготь, припаивать в замок лишние кнопки? Не хочется :)

Однако, и скептики в комментариях были тоже совершенно правы. Система работает практически без ошибок, но в ситуации полной пробежки: мы включили замок, и вот он пошел вращаться два своих оборота и далее до упора. Потом обратно. И там все очень хорошо работает. Но в реальности задача немного иная: надо быстро защелкнуть замок (например, на один оборот, потом можно подождать с полчасика и еще на один). А потом на этот оборот надо быстро повернуть обратно и открыть. Понятно, что при закрытии замка мотор должен остановиться как можно раньше после выполнения работы - чтобы, вернувшись, человек не ждал, пока мотор будет долгие секунды подъезжать обратно, чтобы отщелкнуть замок. И вот тут возникает проблема. Потому что при старте мотора сам собой вылезает огромный ток старта - оно и понятно, система инерционная, на мотор большая нагрузка, пока не раскрутит все шестерни. Ну, пик старта я просто отсекаю - не измеряю пару секунд после старта. А дальше подъезжает пик поворота защелки. И его система зачастую не видит, потому что не успевает набрать статистику ровного хода для своих дисперсий и прочих вычислений:

На этой трагической ноте я мог бы закончить этот пост, и подытожить, что, увы, без кнопки не обойтись. Но я только что для прикола поставил значение размера буфера FLT_lag равным 5 вместо 10, и вообще всё заработало идеально:

Не знаю, надолго ли, будем наблюдать. Но на данный момент математика победила. Слава математике! Спасибо всем за советы и сомнения!

PS: Кому интересно, вот полный скетч для Ардуины-8266 - добавить к вышеупомянутому chuk.c/chuk.h, и можете повторить эксперимент с замком сами ;)

показать основной скейтч ZAMOK.ino

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#include <EEPROM.h>

#include <Ticker.h>

#include "chuk.c"

const char* ssid = "lleo-home-wifi";
const char* password = "le,byeirf";
MDNSResponder mdns;

ESP8266WebServer server(80);

#define led  2
#define led2 16
#define INPUTKN 12
#define MOTO1 4
#define MOTO2 5
#define HALL 13
#define INP0 A0

#define AnalogReadBuffer_MAX 250
int AnalogReadBuffer_count=0;
unsigned int AnalogReadBuffer[AnalogReadBuffer_MAX];
unsigned int AnalogReadSTD[AnalogReadBuffer_MAX];
char INPUTKNRead[AnalogReadBuffer_MAX];

uint8_t A0_log=0;
uint8_t timer_blink=0; // Таймер http://www.pvsm.ru/arduino/111541
unsigned int T1_counter=0;
char motor_go=0;
char motor_upert=0;

  Ticker blinker;
  void timerIsr() { T1_counter++;
    if(!A0_log) return;
    digitalWrite(led,(timer_blink++)&1);
    if(AnalogReadBuffer_count<AnalogReadBuffer_MAX) {
      int x=analogRead(A0),y=FLT(x); if(y==2) motor_upert=1;
      INPUTKNRead[AnalogReadBuffer_count]=digitalRead(INPUTKN);
      AnalogReadBuffer[AnalogReadBuffer_count]=x;
      AnalogReadSTD[AnalogReadBuffer_count++]=y;
    }
  }

int i,pc=0;

// DATA in EEPROM

char motor_pos=1; // последняя позиция мотора
unsigned int Tugo200=250; // порог поворота
unsigned int Tugo500=500; // порог упора
unsigned int Skip500=200; // интервал оценки
unsigned int DelayOtPoroga=200; // задержка от порога
unsigned int DelayOtStarta=200; // задержка от старта
unsigned char MotorSide=1; // прямая-обратная установка в дверь
unsigned char motor_flag_stop=0;

unsigned int eeprom_count=0;
unsigned int eeprom_Tugo200=2; // 2б
unsigned int eeprom_Tugo500=4; // 2б
unsigned int eeprom_Skip500=6; //2,
unsigned int eeprom_DelayOtPoroga=8; //2,
unsigned int eeprom_DelayOtStarta=10; //2,
unsigned int eeprom_MotorSide=12; // 1
unsigned int eeprom_motor_pos=13; // 1


// EEPROM
int f_read(int i) { return EEPROM.read(i); }
int f_save(int i,unsigned char v) { EEPROM.write(i,v); EEPROM.commit(); EEPROM.end(); }
int f_read_int(int i) { return (EEPROM.read(i+1)<<8)+EEPROM.read(i); }
int f_save_int(int i,int v) { EEPROM.write(i+1,highByte(v)); EEPROM.write(i,lowByte(v)); EEPROM.commit(); EEPROM.end(); }

void motor(uint8_t x){
  if(!x) { digitalWrite(MOTO1,0); digitalWrite(MOTO2,0); motor_go=0; return; }
  if(x==1) { if(motor_pos>1) return; digitalWrite(MOTO1,1);digitalWrite(MOTO2,0); }
  else { if(motor_pos==0) return; digitalWrite(MOTO1,0);digitalWrite(MOTO2,1); }
  motor_go=(MotorSide==1)?x:-x;
  motor_upert=0; T1_counter=0; motor_flag_stop=0;
}

void handleRoot() {
  digitalWrite(led,1);
  String s="<!DOCTYPE html><html><head><title>LEOPOLD</title>";
s+="<style>RINPUT {padding:20px;}\n#er {color:red;}</style>";
s+="<script type='text/javascript' src='http://home.lleo.me/projects/arduino/rg.js'></script>";
s+="<script>";
s+="function clean(id){ if(idd(id)) setTimeout(\"var s=idd('\"+id+\"');if(s)s.parentNode.removeChild(s);\",40); }";
s+="function idd(id){ return typeof(document.getElementById(id))=='undefined'?false:document.getElementById(id); }";
s+="function idie(s){ var e=idd('buka'); e.innerHTML=e.innerHTML+s; }";
s+="function printmas(){ var s0=s1=s2='<p>',p=line.originalData,i; for(i in p) { s0+=p[0][i]+','; s1+=p[1][i]+','; s2+=p[2][i]+','; } idie('<hr>'+s0+s1+s2+'<hr>'); }";

s+="var RGON=0; function RG(a,b,kn){ if(a===false||RGON==0) return RGON=0;";
s+="  if(a.length) { for(var i in a) { var c=a[i]*3+1,d=b[i]*100+400,k=(kn[i]&1)*100+850; if(c>1024)c=1024; if(d>1024)d=1024;";
s+="     line.originalData[0].unshift(c); line.originalData[0].pop(); line.originalData[1].unshift(d); line.originalData[1].pop(); line.originalData[2].unshift(k); line.originalData[2].pop();";
s+="} RGraph.SVG.redraw(); }";
s+="    setTimeout(\"AJAX('getlog')\",200);";
s+="}";

s+="function RG_init(){";
s+="line=new RGraph.SVG.Line({id:'rg',";
s+="data:[RGraph.SVG.arrayFill({array:[],value:0,length:300}),RGraph.SVG.arrayFill({array:[],value:0,length:300}),RGraph.SVG.arrayFill({array:[],value:0,length:300})],options: {";
s+="gutterLeft:40,yaxisMax:1024,yaxisMin:0,backgroundGridVlinesCount:30,filled:[true,false,false],\ncolors:['#c00','#00c','#0c0'],\nlinewidth:3,\nfilledColors:['rgba(255,0,0,0.25)','rgba(0,0,255,0.25)','rgba(0,255,0,0.25)'],\nshadow:true}}).draw();";
s+="}";

s+="function AJAX(x){\n";
s+="    var request=new XMLHttpRequest(); request.onreadystatechange=function(){ if(this.readyState==4 && this.status==200 && this.responseText!=null)";
s+="       try{eval(this.responseText);}catch(e){alert('Error Ajax');}";
s+="    }; request.open('GET',x+(/\\&/.test(x)?'&':/\\?/.test(x)?'':'?')+'rand='+Math.random(),true); request.send(null);";
s+="}\n";

s+="var m=[0,1,2,3,4,5,10,12,13,14,15,16],i; for(i in m) document.write((\" <input type=button value='PIN?n=#&on=1' onclick='bu(this)'> <input type=button value='PIN?n=#&on=0' onclick='bu(this)'>\").replace(/#/g,m[i]));";
s+="function bu(e) { AJAX(e.value); }";

s+="</script>";

s+="</head><body onload='RG_init();'>";

s+="<h1>LEOPOLD</h1>";

s+="<center><div style='width:95%;height:400px' id='rg'></div></center>";
s+="<div><input type=button value='A0_ON' onclick='bu(this)'>   <input type=button value='A0_OFF' onclick='RGON=0;bu(this)'></div>";
s+="<p><input type=button value='STOP' onclick='bu(this)'>     <input type=button value='MOTOL' onclick='bu(this)'>   <input type=button value='MOTOR' onclick='bu(this)'>";

s+="<p><input type=button value='OPEN' onclick='bu(this)'>     <input type=button value='CLOSE' onclick='bu(this)'>";

s+="   <input type=button value='PRINT' onclick='printmas()'>";

s+="<div id='er'></div><div id='buka'></div>";
s+="</body></html>";

  server.send(200,"text/html",s);
  digitalWrite(led,1);
}

void handleNotFound(){
  String s = "File Not Found\n\n";
  s += "URI: ";
  s += server.uri();
  s += "\nMethod: ";
  s += (server.method() == HTTP_GET)?"GET":"POST";
  s += "\nArguments: ";
  s += server.args();
  s += "\n";
  for (uint8_t i=0; i<server.args(); i++){ s += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
  server.send(404, "text/plain", s);
  digitalWrite(led,1);
}

void setup(void){

  pinMode(led, OUTPUT); digitalWrite(led,1);
  pinMode(led2, OUTPUT); digitalWrite(led2,1);

  pinMode(MOTO1,OUTPUT); digitalWrite(MOTO1,0);
  pinMode(MOTO2,OUTPUT); digitalWrite(MOTO2,0);

  pinMode(HALL,INPUT_PULLUP);

  pinMode(INPUTKN,INPUT_PULLUP);

  pinMode(INP0,INPUT);

  // pinMode(tuk, OUTPUT);

  Serial.begin(115200);

  Serial.println("RESET");

  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while(WiFi.status() != WL_CONNECTED) {
    digitalWrite(led,pc); pc=(!pc)&&1; digitalWrite(led2,pc); delay(200);
    Serial.print(".");
  }
  digitalWrite(led,1);
  digitalWrite(led2,0);

  Serial.println("");
  Serial.print("Server ESP #"); Serial.println(ESP.getChipId());
  Serial.print("Connected to "); Serial.println(ssid);
  Serial.print("IP address: "); Serial.println(WiFi.localIP());

  if(mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }

 server.on("/", handleRoot);

 server.on("/ping",[](){ server.send(200,"text/plain","OK");});

 server.on("/MOTOL",[](){ motor(1); server.send(200,"text/plain","idie('MOTOL<br>')"); Serial.println("MOTOR 1"); });
 server.on("/MOTOR",[](){ motor(-1); server.send(200,"text/plain","idie('MOTOFF<br>')"); Serial.println("MOTOR -1"); });

 server.on("/STOP",[](){ motor(0); server.send(200,"text/plain","idie('STOP<br>')"); Serial.println("MOTOR OFF");});

 server.on("/A0_ON",[](){ A0_log=1; AnalogReadBuffer_count=0; FLT_c=0;

// for(int c=0;c<10;c++) AnalogReadBuffer[AnalogReadBuffer_count++]=10;

 server.send(200,"text/plain","idie('A0_ON<br>'); RGON=1;RG([]);"); Serial.println("A0_ON"); });
 server.on("/A0_OFF",[](){ A0_log=0; digitalWrite(led,1); AnalogReadBuffer_count=0; server.send(200,"text/plain","idie('A0_OFF<br>'); RGON=0;"); Serial.println("A0_OFF"); });

 server.on("/getlog",[](){ if(!A0_log && AnalogReadBuffer_count) return server.send(200,"text/plain","RG(false);");
      String s="",d="",k=""; for(i=0;i<AnalogReadBuffer_count;i++) {
        s+=(i?",":"")+String(AnalogReadBuffer[i],DEC);
        d+=(i?",":"")+String(AnalogReadSTD[i],DEC);
        k+=(i?",":"")+String(INPUTKNRead[i],DEC);
      }
      AnalogReadBuffer_count=0;
      server.send(200,"text/plain","RG(["+s+"],["+d+"],["+k+"])");
 });

 server.on("/getset",[](){
   String s="clean('sform');idie(\"<form id='sform' action='/set'>";
   s+="<br>Max-do: <input name=Tugo200 value='"+String(Tugo200,DEC)+"'>";
   s+="<br>Max-end: <input name=Tugo500 value='"+String(Tugo500,DEC)+"'>";
   s+="<br>Skip: <input name=Skip500 value='"+String(Skip500,DEC)+"'>";
   s+="<br>Delay-do: <input name=DelayOtPoroga value='"+String(DelayOtPoroga,DEC)+"'>";
   s+="<br>Delay-start: <input name=DelayOtStarta value='"+String(DelayOtStarta,DEC)+"'>";
   s+="<br>Motor-side: <input name=MotorSide value='"+String(MotorSide,DEC)+"'>";
   s+="<p><input type=submit value='SAVE'></form>\");";
   server.send(200,"text/plain",s); Serial.println("OK");
  });

 server.on("/set",[](){
   i=server.arg("Tugo200").toInt(); if(i<50||i>400) { server.send(200,"text/plain","er('Error Max-do (50..400)')"); return; } Tugo200=i; // EEprom
   i=server.arg("Tugo500").toInt(); if(i<50||i>800) { server.send(200,"text/plain","er('Error Max-end (50..800)')"); return; } Tugo500=i; // EEprom
   i=server.arg("Skip500").toInt(); if(i<1||i>5000) { server.send(200,"text/plain","er('Error Skip (1..5000)')"); return; } Skip500=i; // EEprom
   i=server.arg("DelayOtPoroga").toInt(); if(i<50||i>800) { server.send(200,"text/plain","er('Error Delay-do (50..800)')"); return; } DelayOtPoroga=i; // EEprom
   i=server.arg("DelayOtStarta").toInt(); if(i<50||i>800) { server.send(200,"text/plain","er('Error Max do (50..800)')"); return; } DelayOtStarta=i; // EEprom
   i=server.arg("MotorSide").toInt(); if(i!=1&&i!=0) { server.send(200,"text/plain","er('Error Motor-side (0 or 1)')"); return; } MotorSide=i; // EEprom
   server.send(200,"text/plain","clean('sform')");
 });

 server.on("/PIN",[](){
    char i=server.arg("n").toInt(),on=server.arg("on").toInt();
    pinMode(i,OUTPUT); digitalWrite(i,on);
    String s="Pin #"+String(MotorSide,DEC)+" "+(on?"ON":"OFF");
    server.send(200,"text/plain","idie('"+s+"<br>')"); Serial.println(s);
 });

 // 


  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");


  blinker.attach(0.05,timerIsr);
  digitalWrite(led,1);
}


int top=0;
int an=0;


void loop(void){
  server.handleClient();

  if(motor_go) {
    an=0;
    if(an>400 || T1_counter>50) motor(0); // таймаут или адский ток
    else if(!motor_flag_stop && T1_counter<3) motor_upert=0; // первые заедания проезжаем
    else if(motor_upert) {
      if(motor_flag_stop) {
        if(T1_counter>13) motor(0); // выдержали паузу - и остановили
      } else { motor_flag_stop=1; T1_counter=0; } // сбросить счетчик и начать отсчет паузы для остановки
    }

} // else { if(digitalRead(HALL)==0) motor(1); }

}
<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
Страницы, которые привлекли мое внимание за последние дни, рекомендую:
2017-11-22 В июне 1982
архив ссылок
Оставить комментарий
Mac Safari Chrome
 Москва
2
0
tucher (#6772593)
«Но кнопка мне не нравится, потому что это неспортивно. Ну правда же, на дворе 21 век, все предыдущие века толпы седых математиков думали, карандаши грызли, в безумие впадали, и всё для чего?»
Это более чем спорный подход для этой конкретной задачи:)
Хотя главное, чтобы и задача решилась, и интересно было.
Linux Ubuntu Firefox
 Москва
2
0
Leonid Kaganov
Не, ну правда - кнопкой я управлял моторчиками в 8 классе, это было 30 лет назад. Сейчас мне интересно поработать с вычислительным анализом сигналов - хотя бы в таком простом варианте.

Вы, кстати, в курсе, как современная стиральная машина взвешивает бельё? Наливает воду по чуть-чуть и смотрит, как меняются токи ток мотора барабана. Конечно тоже можно весы поставить электронные или кучу кнопок с разной силой нажатия... Но мысль-то человеческая должна работать? ;)
Windows Firefox
 Киев
12
0
Кондыбас (kondybas)
Вот конкретно в данном отдельно взятом случае все опирается на нуль-гипотезу о неизменности механических характеристик замка и привода с редуктором.

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

В порядке суходрочки оценивать протекание процессов по косвенным - увлекательно, но если задаваться военно-прикладным вопросом, то нужно снимать первичные данные. Положение ригеля. Вот то, что зеленым отображается. Вот тогда можно быть относительно уверенным, что девайс будет делать ожидаемое.
Linux Ubuntu Firefox
 Москва
0
0
Leonid Kaganov
Ну да, я кнопка конечно вечная. Через полгода не стопчется от постоянных ударов металла, не отклеится, не перекосится.
Linux Ubuntu Safari Chrome
 Белая Церковь
6
0
ufm3 (#6625608)
Кнопка, конечно, не вечная.
Поэтому нужно работать по кнопке (так как она даёт наиболее точный результат), а кнопку контролировать уже по току.
И если кнопка отказывает - уходить в "аварийный режим", при котором:
1. Вопить об отказе кнопки.
2. Выполнять минимальный набор (полное открытие и закрытие), который можно более-менее по току гарантированно контролировать.
Windows Safari Chrome
 Красноярск
0
0
balal
Леонид, данная модель кнопки неудачная, не для этого она предназначена, и со временем имеет большую вероятность начать глючить (из опыта общения с такими кнопками). Для такого применения или советские кнопки МП1 - МП9 или их аналоги, включая кнопки для мышей, либо пара или даже один (прямо детали модет касаться) подпружиненный контакт как от реле.
Ну вот, позанудствовал...
Linux Ubuntu Firefox
 Москва
6
0
ilya-ya
Вместо не вечной кнопки нужно поставить вечную оптопару
Windows Firefox
 Москва
2
0
Johny----------- (#6761238)
а вы леондин, как человек с детства лазающий в лифтовой механике должны помнить что такие ответственные кнопки дублируются.
а так же при неправдоподобных сигналах с кнопки система должна сообщать зажигать "check engine" и переходить в аварийный режим работы ( тянуть ригель по времени )
Linux Ubuntu Firefox
 Германия
1
0
gehrmann
Что-то идея про потенциометр, хотя она самая надёжная и ясная, прошла незамеченной.
Windows Safari Chrome
 Харьков
0
0
eq
Такая кнопка на куске скотча не проработает полгода.
Нормальный недорогой концевик, типа Omron D2F, переживет несколько десятков замков.
Windows Firefox
 Киев
0
0
Кондыбас (kondybas)
Еслишо, то "завтра похолодает" - это была фигура речи, а не пророчество.
Windows Firefox
 Днепропетровск
0
0
Theoristos1 (#5514894)
Я б сделал две насечки на стержне и индукционный датчик.
Хоть он и энергию жрет.
Mac Safari Chrome
 Нидерланды
1
0
tucher (#6772593)
Вот-вот я именно про это и говорил:) А стиральная машина — всё другая история, тут аналогия не очень уместна.
Windows Safari Chrome
 Домодедово
4
0
id
Ну просто это две совсем разные задачи: "поработать человеческой мыслью интереса ради" и "сделать надежный замок" :)

Так-то я и не сомневался, что задача "увидеть пик 10 раз подряд" - решаема. Решаема, конечно. И 100 раз подряд она сработает. Я лишь сомневаюсь в решаемости задачи "Обеспечить надежность работы системы на уровне не меньше, чем у простого контакта".

Да, и еще: сейчас мотор новый, работает чистенько... Но что будет, когда пластиковая задняя крышка слегка поплывет, подшипники поизносятся, а щеточный узел подразмочалится?
Linux Safari
 Москва
1
0
да-да Слушаю
поэтому я никак не могу выкинуть бош 95 года. механика наше все.
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
Плюс тыщастопицот! Механика и только механика, никакой электроники, тем более "умной" электроники. Умной электроники не бывает, рано или поздно она всё равно сбоит и делает всё неправильно. Так что если надо надёжно, то исключительно и только механика.
Windows Safari Chrome
 Fremont
1
0
AYOUNG
Моя старая стиралка ASKO взвешивает бельё ещё проще.
Наливает воды до нижнего уровня, делает несколько оборотов, снова доливает до уровня. Так до семи циклов. И вот сколько воды впиталось, столько и белья. В пустом барабане вода после прокрутки не убывает, некуда впитываться. В полностью мокром тоже не убывает. Время дополнительного долива известно, скорость подачи воды считается по первому наливу.
Windows Firefox
 Санкт-Петербург
5
0
тупиточка
Умные технари высмеяли поделку Каганова, а хитрый Ллео взял и применил алгоритм к торговле биткойнами, для анализа курса на бирже. И теперь bot-esp8266 зарабатывает больше технарей.
Linux Ubuntu Firefox
 Москва
0
0
Leonid Kaganov
Биткоин-то сегодня до 1500 скакнул.
Windows Firefox
 Москва
2
0
konachodas
Так и че алгоритм-то говорит? Это локальный максимум? Продавать?
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Флуктуации. Упадет еще, но в целом рост.
Windows Firefox
 Вьетнам
0
0
безобразие
Кажется, кто-то следит за рынком.
В эфир надо вкладывать, в эфир.
Windows Firefox
 Калуш
2
1
Val
Про то, что гумманитариям не место в инженерии, здесь уже писали?..
Linux Safari Chrome
 Москва
5
1
Leonid Kaganov
По орфографии видим, что не гуманитарий :)
Windows Firefox
 Калуш
1
0
Val
Смотрю на код.
1. Про форматирование здесь уже писали. Воспользуйтесь достижениями народного х-ва, например: http://format.krzaq.cc/
2. Файл "chuk.h" по мнению автора входит в стандартную поставку всех С++ компилеров, поэтому его приводить не надо.
3. Объявлять функции статиками в отдельно взятом (может слитно пишется, я хз) от класса сорце - это хипстерство? =)
Linux Safari Chrome
 Wisconsin Rapids
0
0
Gena Kukartsev
По поводу 1, совсем немногие способны воспользоваться подобными советами, да еще сказать об этом публично, да еще когда совет был так сформулирован.

Что касается 3, то ЛЛео ж готовится в коммерческие программисты, привыкает отделять интерфейс от (секретной проприетарной) имплементации. :) А если серьезнее, подозреваю, что просто привык так делать еще в те времена, когда не очень понимал, что компьютер делает со всеми этими сорцами.
Mac Safari
 Израиль
2
0
braintunic
> 2. Файл «chuk .h» по мнению автора входит в стандартную поставку всех С++ компилеров, поэтому его приводить не надо

То что лично вы не смогли найти этот файлик на полстранице текста, ещё не значит, что его нет ;)
Windows Firefox
 Калуш
0
0
Val
Я понял: это технология #include методом Суслика =)
Linux Safari Chrome
 Москва
1
0
Leonid Kaganov
Молодец, мальчик, по орфографии видим, что не гуманитарий :)
Windows Firefox
 Калуш
1
0
Val
Я исчо, и пунктуацию не - умею.
Linux Safari Chrome
 Mt Laurel
0
0
Gena Kukartsev
А откуда понятно, что мальчик?
Windows Firefox
 Калуш
1
0
Val
Тут противоречивая ситуация. С одной стороны я не девочка. С другой - мне 39 лет. Казалось бы, при чем тут Остап Бендер...
Linux Safari Chrome
 Wisconsin Rapids
0
0
Gena Kukartsev
Я подозреваю обычный культурно сформированный неосознанный мужской шовинизм. :)
Windows Safari Chrome
 Петрозаводск
1
0
igronus (17884693)
Уважаю результат, но ужасное форматирование кода делает его совершенно нечитабельным. Давно ведь придумали всякие нотации-хуяции, отступы и переносы строк. Тем более современные редакторы и среды разработки делают почти всю работу за вас.

Сравните сами, одна и та же функция, но по-разному записанная.



Windows Safari Chrome
 Петрозаводск
0
0
igronus (17884693)
Лол, саблайм накосячил с первым ифом. Но в целом идея, надеюсь, понятна.
Linux Safari Chrome
 Москва
1
1
Leonid Kaganov
Я форматирую код так, как удобно мне. Мне удобно видеть сущности кода, а не верстку синтаксиса. Если вы не можете увидеть, что делает код, глянув на строку - увы.

Знаю людей, которые и стихи не могут читать, форматированные в один абзац - не чувствуют рифмы. Для них рифма - это там, где конец строки. Иначе каша и ничего не понятно :) Ну а дети еще не умеют читать слова мелким шрифтом без расставленных ударений.
Mac Safari
 Израиль
5
0
braintunic
> Я форматирую код так, как удобно мне

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

Code review, code coverage, configuration management, defect tracking - все это тебе практически не нужно в одиночку, но станет необходимым в команде.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Команды разные бывают. Когда я только начинал программировать 30 лет назад, у нас в командах писали каждый оператор на отдельной строке.

MOV (R1)+,R3
INC R3
XOR R3,#377
JMP METKA

А сейчас такие команды, где писать код вообще не принято. Сейчас принято найти подходящий фреймворк и настроить, разобравшись с конфигом в XML.
Mac Safari
 Израиль
0
0
braintunic
> сейчас такие команды, где писать код вообще не принято

Подозреваю, что в такой "команде" ты работать не захочешь ;)
Windows Firefox
 Санкт-Петербург
2
0
Tarn
Как-то старый программист с моей работы, вспоминая советские ламповые времена, рассказывал про одного шизика, который программы на PL/1 сплошняком хуячил, даже без пробелов, благо компилятор всё сожрёт. Ну, то есть, испишет очередную строчку этой поебенью, в восьмидесятый символ упрётся рогом, допустим, на "BE", а "GIN" уже с новой строки пошло. Если правку какую внести надо, то всё, что ниже места правки, подлежит повторной пертурбации.
Очень большая экономия места и пробелов у него выходила, перфокарты, наверно, берёг. Зато, понимать и править его программы умел только он сам.
Linux Safari Chrome
 Wisconsin Rapids
1
0
Gena Kukartsev
Ну в этом и дело: все время все меняется. Люди склонны переставать учиться как только им начинает казаться, что они знают достаточно, программисты в том числе, поэтому многие застревают в разных моментах прошлого. Лучшие учатся и в том числе переучиваются непрерывно и много. Но это трудно и неприятно, хоть и приводит к результатам.
Windows Firefox
 Киев
0
0
Кондыбас (kondybas)
Существуют бьютификаторы, умеющие приводить код к любому синтаксически корректному виду. Пишется две спецификации - удобная себе и принятая в конторе. Вуаля.

Мне особенно приглянулся http://uncrustify.sourceforge.net/
Windows Safari Chrome
 Петрозаводск
9
0
igronus (17884693)
> Если вы не можете увидеть, что делает код, глянув на строку - увы.

В том-то и дело, что все видно, но времени на разбор мозгом тратится гораздо больше. Это как с текстом: попробуйте прочесть пару страниц без абзацев. Потом верните все как было и вздохнете с облегчением.
Linux Firefox
 Москва
1
0
просто Фыва Jr Олдж
Как может быть удобно когда всё в одну строчку? Никогда не понимал, не понимаю и наверное вряд ли когда пойму. То есть сам код я пойму, но я не понимаю удобства такого вот написания. Как абсолютно правильно ниже сказал igronus, при чтении такого кода тратится гораздо больше времени на понимание что же там делается, причём хоть чужого кода, хоть своего. Пока подобный ужас через indent или uncrustify не прогонишь там сам чёрт ногу сломает читать такое.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
а Джим Хаккер бы смог!
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
Ну этот бы точно смог! В лаборатории Lovely Assembler People любой бы смог! Хотя там и всего один сотрудник на всю лабораторию, и начальник, и бухгалтер, и сам Джим Хаккер.
Linux Safari Chrome
 Wisconsin Rapids
0
0
Gena Kukartsev
Поэтому печеньку тому, кто переведет Леонида на Питон, там минимальную культуру форматирования кода требует сам язык. К счастью, прошли времена, когда PHP был каким-то специально удобным языком для server-side web development. Теперь как угодно можно. :)
Linux Safari Chrome
 Тольятти
1
0
binarydata
А теперь главный вопрос: пробелы или табы? )
Linux Ubuntu Firefox
 Германия
1
0
gehrmann
Имена типа:
FLT_*, fildy, *_TOL, *_D, *_c, N, d, *_stdd, mu
не есть гут, так как забываешь их смысл через некоторое время.

В отличие от говорящих:
*_THRESHOLD, *_INFLUENCE
Mac Safari
 Израиль
1
0
braintunic
> Ну правда же, на дворе 21 век, все предыдущие века толпы седых математиков думали, карандаши грызли, в безумие впадали, и всё для чего?

Что-то мне напоминает эта аргументация...
А, точно - старинный фильм "Барбарелла"!

Ну правда же, на дворе 41-й век, все предыдущие века толпы ученых думали - и всё для чего?
Чтобы опять по старинке заниматься чудовищным примитивным первобытным генитальным сексом?
Ведь давно есть специальные таблетки для оргазма - упираешься в партнёра ладонью, глотаешь таблетку и вуаля!


Mac Safari
 Москва
7
0
Дмитрий-3
Так Лео и занимается сексом 21 века с ардуиной и моторчиком, а не этими вашими первобытными генитальными извращениями.
Mac Safari
 Израиль
5
0
braintunic
> Лео и занимается сексом 21 века с ардуиной и моторчиком


Windows Safari Chrome
 Челябинск
0
0
vinny-the-poo
Я уже замучился гуглить, но так и не понял, что может означать "back to pixels" в данном контексте.
Mac Safari
 Израиль
1
0
braintunic


Mac Safari
 Израиль
0
0
braintunic
А если серьёзно, я думаю, что чувак (тот кто сгенерировал эту обложку) просто переиначил на свой лад известное выражение "back to ashes" или "back to dust" - взятое либо из Библии либо из учения Шивы.

Уверен, что это выражение вы легко сумеете нагуглить ;)
Windows Safari Chrome
 Киев
0
0
Maxfactor9
...В виде кнопки.
Windows Safari Chrome
 Челябинск
5
0
vinny-the-poo
Боже, какой пещерный примитив!
У нас и касаться никого не нужно:



Linux Firefox
 Boulder
4
0
Михаил (#1684620)
> пик старта я просто отсекаю - не измеряю пару секунд после старта

С какой же скоростью он у вас открывается, что сам старт «пару секунд» занимает?!

(Мои советы по исправлению алгоритма вы почему-то проигнорировали, и, судя по картинкам, получили вполне ожидаемый ужас.)
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Извините, мне накидали несколько десятков советов и ссылок, не было возможности осмыслить и реализовать все. А что ужасного в картинках, можете пояснить?
Linux Firefox
 Boulder
1
0
Михаил (#1684620)
Я там прокомментировал прямо под вашим «Cделал модельку на PHP». Ищите про гистерезис (и предыдущий комментарий).

Ужасное:



И что «не успевает набрать статистику ровного хода» (если так её набирать, то не удивительно).
Windows Safari Chrome
 Киев
8
0
oblamingo
пиппец - пять экранов кода и сломаные мозги, лишь бы ключ не доставать
Mac Safari
 Израиль
2
0
braintunic
Не сломанные, а проветренные!
Windows Safari Chrome
 Киев
4
0
oblamingo
выветренные
Linux Safari Chrome
 Mt Laurel
2
0
https://plus.google.com/+AlexanderLevitskiy
А я бы пожалуй поставил оптический читатель штрихов на язык замка или tone wheel на вращающийся элемент. Тогда можно будет откалиброваться на минимальное время запирания.
Windows Firefox
 Санкт-Петербург
8
0
Tarn
"Ну, пик старта я просто отсекаю - не измеряю пару секунд после старта".

Ну вы, Леонид, всё-таки мощный колдун. За пару секунд я обе свои двери, на все обороты закрытые, жылезными ключами открываю.
Windows Safari Chrome
 Йошкар-Ола
2
0
artemy12
А некоторые люди хотят скажем, застегивать пуговицы на пиджаке ходулями, и желательно, не глядя. Вы что, против?
"А ты не ходи в наш садик...")))
Windows Safari Chrome
 Санкт-Петербург
0
0
[email protected]Кошак (cats-shadow)
О! TNX!
Этот код можно ж ещё ко всякому привинчивать :)
Windows Safari Chrome
 Домодедово
1
0
id
А, сразу-то и не подметил:

> Зеленая линия - идеал: моменты, когда двигается щеколда замка.

Конечно же, нет. Зеленая линия - это моменты, когда движение щеколды разблокировано. А вот о том, двигается она или нет - и куда двигается - мы, на самом деле, можем лишь выдвигать гипотезы. Иными словами, у нас мало того что косвенное измерение - так еще и относительное: счетчик событий есть, а вот начальные условия приходится задавать отпотолочно. "Предположим, что сейчас замок полностью закрыт... Тогда, один импульс будет означать, что замок наполовину открылся..."
Ох :)

...Вместо того, чтобы таки взять - да и поставить концевики на "щеколду" :)
Linux Safari Chrome
 Wisconsin Rapids
1
0
Gena Kukartsev
Леонид, теперь, когда задача решена, скажите, зачем это: "Но в реальности задача немного иная: надо быстро защелкнуть замок (например, на один оборот, потом можно подождать с полчасика и еще на один)."??? :)
Linux Ubuntu Firefox
 Москва
1
0
Leonid Kaganov
Ну, это, так сказать, внутренняя особенность семьи: две квартиры на одной лестничной площадке, постоянно шастаем через двери. Ситуация, когда дверь открывается не 2 раза в сутки, а 30 раз - как раз и требует специальных замков, чипов в руке и т.п. Чтоб открыть дверь, уходя на работу и приходя вечером, - это я б не стал морочиться вообще.
Windows Safari Chrome
 Домодедово
5
0
id
Использовать два замка? Ригельный для "все ушли на фронт", и электромагнитную щеколду - для режима "проходной двор"?
Windows Safari Chrome
 Красноярск
0
0
balal
Ну, при таких условиях точно важна надёжность датчиков, какие-нибудь потенциометры, например, быстро сотрутся, да и сам коллекторный двигатель очень уж не вечный, вот бы безколлекторный взамен или шаговый!
Linux Firefox
 Boulder
3
0
Михаил (#1684620)
Если взять шаговый или, тем более, бесколлекторныё с выходом оборотов, то никакого секаса с «вычислительным анализом сигналов» не будет. А так романтека — пока отладишь алгорифм, в моторе щётки сотрутся, и надо будет другой замок покупать.
Windows Safari Chrome
 Москва
0
0
Max
Как я понимаю учет мощности идет самой esp8266?
Это может привести к еще одному багу:
чип хоть и мощный, но вынужден заниматься WiFi, а значит активность в сети WiFi (пара запросов с сервера или помеха по каналу-потеря соединения с роутером - реконект) может вызвать заминки в замерах и тупо пропуски в данных.
И наоборот слишком долгий основной цикл без пауз может нарушить работу WiFi. Или долгий обработчик прерываний...
Вообще пауза может оказаться длинней если системе нужно еще подумать... (это о дрифте частоты замеров)
И еще одна фишка которая меня в последнее время расстраивает в этом чипе - нет нормального доступа к железным прерываниям и счетчикам :( Тупо счетчик воды требует отдельного обработчика, который будет вызываться через "системный" обработчик. В тойже ардуине можно считать импульсы железным счетчиком и не парить проц.
Linux Ubuntu Firefox
 Москва
0
0
Leonid Kaganov
Нет, это чисто мотор замка.
Windows Safari Chrome
 Москва
1
0
Max
Я имел в виду, что сама ESP через функцию AnalogRead читает потребляемую мощность мотора и потом ее анализирует. При этом используется софтовый таймер-прерывание.
Так вот, этот таймер имеет дрифт зависящий от внешних факторов (хотя если мотор открывает замок в течении нескольких секунд, то дрифт не столь значителен). А при скоростных процессах можно просто пропустить событие (всплеск).
И второй момент, если обработчик "задумается" при анализе, то это может вызвать сбои в работе WiFi.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Почему вы думаете, что прерывание таймера необязательно и отодвигаемо? Это же прерывание, не жук накакал. Другой вопрос, что сейчас оно у меня вообще очень редкое - около 200 мс наверно. Ничего не мешает мне увеличить частоту измерений раза в три, тогда наверно точность вообще станет отличной.

Сейчас таймер запускается так: blinker.attach(0.05,timerIsr); Вот не помню, что такое .05
Windows Safari Chrome
 Волжский
0
0
дануопятьрегистрацияотпаласамвиноваткукипотер (#6775833)
> сейчас оно у меня вообще очень редкое - около 200 мс наверно.
> Ничего не мешает мне увеличить частоту измерений раза в три,
> тогда наверно точность вообще станет отличной.

> Сейчас таймер запускается так: blinker.attach(0.05,timerIsr); > Вот не помню, что такое .05

Число прерываний в миллисекунду?
Linux Safari Chrome
 Тольятти
0
0
binarydata
> не помню, что такое

Вот именно для этого и придумали константы
Windows Safari Chrome
 Челябинск
0
0
vinny-the-poo
Вчера (упс, уже позавчера) пришлось срочно впендюривать в схему управления реле времени, чтобы обеспечить достаточную длительность для сигнала переинициализации контроллера. Полчаса исходил на удобрение, безуспешно пытаясь задать нужный интервал, после чего пришлось развернуть инструкцию на реле.

Оказалось, что переключатель 1s, 10s, 100s... который я принимал за множитель, означает диапазон. Трудно выставить уставку в 3 секунды на диапазоне 1s.
Windows Safari Chrome
 Москва
0
0
Max
Это не прерывание по таймеру. Это софтовая опция (планировщик задач в винде) с низким приоритетом. Функция реализована программно т.к. основная задача чипа это WiFi, а на всех "пользователей" встроенных таймеров не хватит, по слухам их только 3 шт.

200мс довольно большое время и разница между 200мс и 250мс вам не критична. Но ради эксперимента я бы попробовал в момент работы моторчика отправить пачку web запросов на модуль, или отключил роутер. Мне даже уже стало интересно какова будет реакция модуля на такие издевательства.

P.S. а как производитель планировал учет положения "ключа". Как я понял по картинке, моторчик крутит ручку открывания замка изнутри квартиры. У ручки есть "правильное положение покоя". Если уж есть моторчик, то неужели к нему так сложно добавить "счетчик оборотов" или датчик положения. Ведь ясно что без него эта поделка не пригодна...
Windows Firefox
 Франция
1
0
Пыль (#6776076)
Ллео здравствуйте,
Хочу вас отговорить от установки этой херомантии в дверь и тем более подсчёта всяких импульсов-шмигинсов. В теории это всё красиво, но однажды вы столкнётесь с тем, что в ригеля попала пыль, ток на двигателе возрос, ардуино подумало что дверь открыта и остановило замок. И вы, как однажды я, проведёте 2 часа снаружи, в ожидание МЧС с болгаркой. По моему опыту самый православный замок это накладной, с самым простым радиореле и бесперебойником на 7А/ч.
Замок сам защёлкивается на выход.
На вход нажимаете кнопку на пульте.
Замок
Блок питания 12 Вольт
Аккумулятор 7А/ч
Радио реле
Linux Safari Chrome
 Москва
2
0
Leonid Kaganov
Что значит "Ардуино подумало что дверь открыта"? Откройте ее снова, пока не откроется. Не надо программировать Ардуино на идиотские блокировки.

По поводу замка, который вы советуете - вот как раз его я и собираюсь менять. У него есть минусы - он грохочет и несовместим с доводчиком. Поэтому с ним не сделать дверь, которая плавненько запирается сама. Для гаража замок хорош, для квартиры - уродлив и давно надоел.
Windows Firefox
 Щелково
0
0
abrrvalk
Есть классный электрозамок который ставится не в дверь а вообще в ответную часть. Имеет нулевое усилие как при закрывании так и при открывании. В основе поворотная деталь за которую цепляется язычок замка.

Гуглится тяжело но реально. Стоит дорого.

UPD:
всё проще
http://www.alarmico.ru/catalog/elektricheskie_zashchelki/
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Отжимается фомкой или даже отверткой. В случае поломки или отключения электричества не имеет возможности открывания ключом. Вы серьезно думаете, что я не в курсе всех доступных на сегодня моделей замков, и выбрал новый электрозамок вместо старого электрозамка наобум? :)
Windows Firefox
 Москва
0
0
abrrvalk
Хорошо, раз в курсе...

PS
Фомкой отжимается подавляющее большинство входных дверей. Не зависимо от замка (особенно если ригели на 1 сторону).

В качестве быстрой закрывалочки у меня стоял автомобильный актуатор на задвижку. Простая и надежная конструкция. Для надежности можно поставить два актуатора с независимым управлением.
Linux Ubuntu Safari Chrome
 New York
0
0
Кто здесь?
радиокнопка, открывающая замок в квартиру?
Ну-ну. Предлагаю эксперимент:

Ардуина есть? Вот там на фото начинки платка вертикальная - видите ее? Это ресивер, на 433 или 315 Мгц.
Стандартный, продается на Али за 30 руб. в комплекте с передатчиком (либо выковыривается из беспроводного звонка)

Его можно подключить к ардуине и считывать принимаемые коды. Там просто - 1/0 - двоичный код.

Нажимаете кнопочку - принимаете код открытия замка. Кодировка Princeton - 99% она. Четыре посылки статического кода.
А если подключите плату передачика - то сможете и передать его.

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

Но есть и хороший момент: практически то же самое относится к прочим "радиобрелкам" подобного типа - управление шлагбаумами, например, воротами, те же беспроводные звонки.
Мало ли, пригодится?
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Истинную истину глаголите! Шлагбаумы даже с циклическими кодами тоже ломаются элементарно. Только https или собственная wifi замка спасет )
Windows Safari Chrome
 Москва
0
0
[email protected] (варящий яйца в микроволновке) (simpleid/index.php)
Извините, пожалуйста, мою тупизну.

Если мотор замка работает с известной скоростью, то зачем все эти ухищрения с замерами тока и определениями положения? Почему нельзя тупо включать его на (условно) калиброванные 1,75 секунды для закрытия на один оборот и 3,5 секунды для двух оборотов?

UPD: Извините, прочёл ответ в предыдущей записи: "не нравятся константы". ОК.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Совершенно не факт, что скорость постоянная. Завтра изменится напряжение на блоке питания или усилие замка, и скорость поплывет.
Windows Safari Chrome
 Воскресенск
0
0
[email protected] (варящий яйца в микроволновке) (simpleid/index.php)
В первом приближении для того, чтобы скорость двойного оборота достигла скорости одинарного, напряжение должно вырасти в два раза. А это уже фатальное пыщь-пыщь для других компонентов.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Скорости незачем расти именно в два раза. Достаточно немного не доехать до точки открывания. Но к чему эти споры, когда все пока работает, а на крайняк у меня есть датчик зеленой линии, который работает уж точно на 100%?
Linux Safari
 Москва
1
0
Timson (2030202)
Согласно тз про 2 квартиры на площадке есть иное решение: врезать электроз амок ALDB-100 в косяк, а в двери высверлить углубление под шток. Считыватель у вас уже есть, чипы вшиты.Есть напряжение - замок закрыт, нет - шток уходит из двери в косяк.
Тут все что вы хотели: закрыть и открыть быстро, ограничение хода штока, подключение к существующей скуд - 20 минут, ключ вообще не нужен.

Технология прохода (для примера): пока все дома - все замки открыты, кроме этого замка. Для прохода прислонить руку к считывателю и замок менее чем за секунду открыт. Когда все уходят - закрываете свои замки как обычно, а бонусом - еще 1 ригель в двери
Windows Safari Chrome
 Домодедово
1
0
id
Вешаем в квартирных коридорах датчики движения. Пока с них есть сигналы - "электромоторный" замок открыт, работает только электромагнитный (ALDB-100? да, что-то такое я и имел в виду). Сигналы со всех датчиков движения пропали на какой-то срок (полчаса?) и при этом дверь закрыта? Запираем еще и "электромоторный" замок. При отпирании - отпираются разом все.
В случае, если в квартирах действительно постоянно активная суета - это позволит сократить количество циклов мотора с 100500 до 1-2 в сутки.

О, заодно идея пришла, как обойти уязвимость "пропадание питания" в электромагнитном замке. Да, конечно - питать от ББП, но: зачем без толку высаживать батарею, грея электромагнит? Напряжение пропало - секунд через 30 запираем моторный замок и отпускаем электромагнит. Напряжение вернулось, а в квартирах - суета (датчики движения докладывают)? Минут через пять включаем электромагнит и отпираем мотор.
Linux Safari
 Москва
0
0
Timson (2030202)
Не все так просто. На практике есть проблема у датчика движения и контроллера: человек суетится на выходе, одевая тапочки или "туфли с открытым мыском" (с), из-за чего срабатывает датчик. Начал тикать отсчет в контроллере 3-9 секунд на тот случай, когда замок открыт, но дверь еще не открыли. И как только заканчивается отсчет - замок закрывается и человек пытается открыть закрытую дверь, при этом движения человека интуитивно расчитаны, что дверь открыть можно. В результате: сломанные ногти на руках, удар головой в закрытую дверь, проклятия в адрес кривой техники. Настроить период никогда не получится правильно, ибо кто-то быстро выходит, кто-то медленно. Датчик тоже срабатывает через 1-2 секунды, а значит, обнаружив, что казалось бы, открытая дверь все же закрыта, человек вынужден будет махать руками и ждать новой сработки датчика минимум секунду.
Поэтому вместо датчика движения нужно ставить либо радар (например,на втоматической двери торгового центра стоят радары - пока вы в зоне его децствия дверь не закроется), либо несколько (чем больше, тем точнее будет работать) оптических пар (от одной стены световой луч доотражателя на другой. Типа, как на решетке вентиляции в центре Ленгли в "миссия невыполнима". Только луч не видно). При пересечении луча сработает открывание двери, но команда на закрывание не пройдет, пока человек не выйдет из квартиры.
Второй вариант опасен тем, что проходя мимо входной двери случайно можно ее открыть и она так и будет открытой стоять - воры и прочие неприятности... Потому радар предпочтительнее

по поводу греть электромагнит: можно другой эл замок - закрыто по умолчанию. Для открывания нужно питание подать на замок и ригель откроется. А теперь представьте, что вы уехали в турцию на 10 дней, а в 1й день отключили электричество. Как вы потом попадете внутрь, не сломав дверь?

Да, по поводу закрыть на ночь основной замок - добавить реле времени. Так в магазинах по 500 руб продается красивый таймер с контактиками. На 16 программ и ручное управление расчитан.

Если продолжить по тз смотреть, то можно по сработке радара в вечернее время даже открывать вторую квартирную дверь, но имхо, опасно это
Linux Firefox
 Москва
1
0
просто Фыва Jr Олдж
Бля, какие же вы всё же тут все армянские комсомольцы, которые сначала сами себе создадут трудности, а после их преодолевают. Есть оптимальный, проверенный годами вариант, который на 146% удовлетворяет условию что "при этом движения человека интуитивно расчитаны" -- открывать обычным ключом обычный замок. И не надо никаких задержек на ардуинах или умных контроллерах, не надо никаких оптопар, не надо никаких хитрых концевиков и счётчиков оборотов на перцептронах, не надо ничего дифференцировать или интегрировать. Интуитивно ключ повернул, замок открылся, дверь толкнул опять же интуитивно и дверь открылась. Бинго и профит! А тут начали выдумывать какую-то инкридибл мэшин, блин, для выполнения простейшей операции, которую даже ребёнок совершит без напрягов.

"Умные дома" -- ф топку! И любой ИИ туда же. Как абсолютно правильно сказал да-да Слушаю: "Механика нашё всё!"
Windows Safari Chrome
 Домодедово
0
0
id
Кстати да!

Обычная ручка открывания замка, которая обычным механическим образом его открывает. Открывает - если она механически соединена с замком.

А вот будет ли она с ним соединена - определяется состоянием электромагнита, который включается по сигналу от считывателя импланта, который расположен в этой самой ручке или рядом с ней :)
Windows Firefox
 Нидерланды
1
0
Пыль 9 (#6776229)
Я вам очень сильно хочу ответить в 5 раз, сайт посылает.
Лет ми шою фром май харт, как говорится.
Вас просто не обносили домушники. У меня в гараже увели зимнюю резину, цена вопроса 12 тыр за все колёса. И тут подумалось если у меня давление подскочило из-за этой неприятности, то что же будет если обнесут квартиру. И я поставил замок у которого нет личинки, открывается с китайского пульта, код не подобрать (китайский же). Проводил тест-драйв - реально ломал фомкой, - не сломал, притом что замок на 4х болтах в 3 миллиметровой стали. Казалось бы ерунда. Не вышло.
Windows Safari Chrome
 Домодедово
0
0
id
Стоп, погодите... "Все не так!" (с)

Два замка: ригельный с электромотором и редуктором и электромагнитная щеколда (вот хоть так же ALDB-100).
В закрытом состоянии двери она всегда заперта как минимум на один из этих замков, и отпирается штатным образом: картой, имплантом или чем еще там.

А датчики движения нужны, чтобы решить - на какой замок запирать дверь. Если в квартирах - суета, то запираем только на электромагнитный замок: он быстро открывается и закрывается и у него большой ресурс. Но - механически он менее стоек к вражескому лому, чем замок с электромотором (банально из-за размера и количества ригелей). Поэтому, если в квартирах вдруг прекратилась суета (все спят, или все уехали на неделю на море) - контроллер автоматически запирает дверь еще и на замок с электромотором. И отпирает замок с электромотором при первом же "штатном" отпирании двери или при возобновлении активной суеты в квартирах (утром все проснулись, и скоро рванут на работу).

То есть: не отпирать дверь по датчикам движения в квартирах, а лишь решать - на какой из замков ее запирать.

> по поводу греть электромагнит: можно другой эл замок - закрыто по умолчанию. Для открывания нужно питание подать на замок и ригель откроется. А теперь представьте, что вы уехали в турцию на 10 дней, а в 1й день отключили электричество. Как вы потом попадете внутрь, не сломав дверь?

Я ведь как раз и описал решение этой проблемы? Два замка: нормально-открытый электромагнитный и электромоторный. При отключении электричества выжидаем небольшую паузу (вдруг отключили временно? просто выбило автомат, и сейчас его кто-то включит обратно?), а затем запираем электромоторный замок - и отпираем электромагнитный. Все, система теперь расходует батарею только на питание контроллера. Если она высадится в ноль - дверь все равно можно будет открыть: ключом. Потому что, когда все-все ушли гулять на улицу, хоть кто-то один догадался взять с собой этот самый механический ключ от электромоторного замка. А в идеале - не кто-то один, а два-три человека, по числу ключей. Теперь нам остается лишь дождаться под дверью возвращения кого-то из них - и вуаля, они откроют нам дверь. Безо всякого электричества.
Windows Safari Chrome
 Казань
0
0
Timson (2030202)
Ээээ... Простите, резюмирую свой предыдущий пост: использование датчиков движения в автоматизации открывания дверей - устарело по 2-м причинам:
1. потому что очень велико суммарное время от обнаружения датчиком непосредственно движения до непосредственно передачи команды на исполнительный механизм эл замка - от 1,5 секунд.
2. до момента возвращения контроллера в состояние, когда он снова будет способен воспринимать сигналы, не менее 5 секунд.

На заре появления такой схемы работы такие задержки по 3-9 секунд были нормальными, ибо не было альтернативы. Сейчас есть альтернатива - радары, оптические пары. Скорость срабатывания - от 0,5 секунд.

А по поводу энергосбережения и схем включения, то мое мнение - все эти приборы = элементы конструктора. А какую схему из десятков варинтов применить из этих элементов на основании технического задания (хотелок заказчика) - дело фантазии проектировщика. Эксплуатация собранной схемы показывает, что пока исправны элементы все схемы работают и неплохо. Но в случае выхода из строя элемента/элементов возникают проблемы по доступу к ним для замены. Любая неисправность всегда не вовремя. Вот вы пишите, например, "Теперь нам остается лишь дождаться под дверью возвращения кого-то из них - и вуаля, они откроют нам дверь. Безо всякого электричества." (С) В 10 случаях именно так и произойдет. Но в 11-м случае человек будет лететь быстрее ветра, чтобы успеть, например, на горшок. И вот "дождаться" - не вариант! И именно на такой случай необходимо рассчитывать, а не на первые 10.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Во-первых, у меня нет дверного косяка, там стальная рама. Во-вторых, а если завтра такой замок захочет поставить друг/брат/сосед/заказчик оптовой партии - им всем тоже сверлить прикажете?
Linux Safari
 Нижний Новгород
0
0
Timson (2030202)
1. Я привел пример эл магнитного замка для деревянных косяков. Но есть вариант и для металлисеского каркаса. Есть для полностью стеклянной двери. Формфакторов много, а суть та же, что я написал выше.

3. И оптовым заказчикам ставим такие замки. Особенно эффективно они работают в связке с радаром (см. выше). А еще вместе с этим комплектом пользуется спросом управление дистанционное - брелок или смартфон.

4. Напишите мне в личку ТЗ полное - отвлекитесь от знания скуд, а сделайте упор на технологии производства: что и когда должно закрываться/открываться, как планируете ходить, сколько народу..... Вот все хотелки пишите, а, я вам напишу оборудование.

2. Хм. Фигануть сверлом 12 мм дырку в металле такая проблема?
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Спасибо, но вы как-то игнорируете тот факт, что оборудование у меня уже есть и его программирование увенчалось успехом (с вашей, читателей, помощью, за что еще раз большое спасибо).
Linux Safari Chrome
 Москва
1
0
Leonid Kaganov
Задача простая - вот это говно, верой и правдой проработавшее 10 лет, убрать:





Взамен поставить тактично закрывающийся доводчик с тихим замком.

Нужно:

- Замок должен быть надежным, дверным, не для ящика стола.

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

- Дверь должна запираться без лязга сама, спустя 15 секунд после того, как доводчик ее плавно прикроет (если ее в первые 15 секунд не распахнули заново).

- Дверь должна отпираться по управляющему сигналу. Если ее не открыли за 10 секунд - запереться обратно.

- Бюджет электронно-управляемого замка вместе с доводчиком и электронными компонентами 3000 руб. Нет, не 10000, не 20000, а именно 3000. Моя схема укладывается с запасом: замок 500руб + электрическая личинка 1100 руб + легкий доводчик 900 руб + ESP8266 200 руб + L293D и всякие резисторы и датчик холла 200 руб и еще 100 руб осталось, купим за 98 руб сканер RC522 и наладим сканирование чипов, меток и карточек от метро в качестве ключей для замка. Админка внутри на вебе по WiFi.

Вы можете предложить для этой задачи аналогичное решение такой же себестоимости? Если да - предложите. Если нет - я вам готов предложить через два месяца после полной обкатки, вы сможете их продавать своим клиентам.
Mac Safari
 Израиль
0
0
braintunic
Подозреваю, что с таким скудным бюджетом ни один бизнес не возьмётся за решение задачи.

Ведь кроме цены компонентов и материалов бизнес должен ещё заплатить исполнителю плюс налоги - а это уже пойдёт в чистый убыток, потому что удешевить компоненты и материалы здесь практически невозможно.
Linux Safari Chrome
 Тольятти
3
0
binarydata


Linux Safari Chrome
 Тольятти
0
0
binarydata
Эпик фейл, "World" конечно же
Mac Safari
 Израиль
1
0
braintunic
Это всего лишь опечатка.
Настоящий фейл - отсутствие артикля "the" перед "real".
Mac Safari
 Москва
0
0
id
Да не, так даже лучше. Загадочнее.
Пусть читатель сам думает: то ли речь о текстовом редакторе, то ли - о том Слове, что было в начале...
Windows Firefox
 Санкт-Петербург
0
0
Tarn
Я вот сразу про MS Word догадался. Даёшь Modelling Real WordStar и WordPerfect, Блеааать!!!
[Упр] [K] [L], [Упр] [K] [F] !!!
Текстовые ПРОЦЕССОРЫ, между прочим, не хрен какой.
Windows Safari Chrome
 Челябинск
0
0
vinny-the-poo
Интересная особенность инерции мЫшленья. Я сразу прочитал как "world", даже не заметил опечатки, пока вы не указали.
Windows Firefox
 Санкт-Петербург
0
0
Tarn
А я заметил, заметил, и сразу запарился, начал искать тайный смысл, не нашёл и впал в панику - неужели я настолько стар и глуп, что не вижу всем очевидного? Мне уже пора? Последний раз позвонить Мэри N, весомо, но благородно проклясть её и купить на Юноне (питерская толкучка) Ремингтон с одним патроном? Оказывается, на этот раз всё-таки обошлось.
Windows Safari Chrome
 Челябинск
1
0
vinny-the-poo
Вот видите, как непрактично излишне параноить? Оказывается, и один может шагать в ногу и "очевидное" может быть ошибочным.

В "Марсианских хрониках" Брэдбери есть одна изумительная часть (собственно, они там все изумительны по-своему). У марсиан была одна особенность — когда их мозг генерил глюки, как следствие психического заболевания, эти глюки становились видны и окружающим на манер голограмм каких-нибудь.

Когда на Марс прибыла земная экспедиция, они ходили и приставали ко всем: "Смотрите, мы инопланетяне с Земли, давайте скорей делать контакт!" Естественно, их все принимали за психов (а вы бы не приняли, встретив такое на своей родной Фонтанке?). В силу вышеназванных причин демонстрация самого корабля не помогала.

В конце концов ими занялся психиатр. Ему показали корабль и дохтур, оценив непревзойдённую реалистичность галлюцинации, объявил, что их заболевание неизлечимо и лучшим выходом будет живительная эвтаназия. Что тут же и осуществил, завалив всех космонавтов из револьверта в полной уверенности, что глюк тут же рассеется.

Но корабль не рассеялся. Мозгоправ решил, что он сам заболел индуцированным психозом, и, верный себе, тут же произвёл самоликвидацию (прямо, как вы собирались, не правда ли?) А ведь это была самая объективная реальность, так-та!

Верьте в себя.
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
А я сразу прочитал именно как написано, "Word", но абсолютно не придал этому значения. Вот если бы фраза по-русски была построена некорректно или по-русски не имела бы смысла или по-русски имела бы малый смысл, то однозначно в мозгах щёлкнул бы переключатель, а так... Да хуй бы с ним, с вордом или с ворЛдом, никакой разницы для России в этом нет и быть не может. Мы не папуасы, у нас язык -- РУССКИЙ!!!
Windows Safari Chrome
 Челябинск
0
0
vinny-the-poo
У вас отсутствует инерция мЫшленья. Это ценный дар, берегите его.
Windows Safari Chrome
 Рязань
0
0
Кухаренко
Немножко оффтопик.
В Чертаново уже который день ровно 3.7 градуса. Там правда так плохо или вы просто градусник в холодильник положили?
С другой стороны, не такой уж оффтопик. Датчики, графики...
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
У них там летучая тарелка упала и поэтому экология немного сменилась. У нас на противоположном конце Москвы в СВАО никаких летучих тарелок нет и не было и поэтому уже третий день +10, для меня погода замечательная -- и не жарко, и не холодно. Вот бы так было 365 дней в году!
Windows Firefox
 Нидерланды
0
0
Пыль8 (#6777065)
Вижу твой камент. Но не вижу на странице. Бага/фича - пофигу. Джонсону передам. Вся тусовка в насере, мы блин, ренегаты, с какими-то геями работаем. Давай как-нибудь пива вмажем?
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
Вижу твой камент. Но не вижу на странице. Бага/фича - пофигу.

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





Давай как-нибудь пива вмажем?

Ну вот, началось... С некоторых пор я не пью ни водку, ни вино, ни пиво.

PS to LLeo: sorry за чат, но "написать личное письмо" неавторизованному аккаунту это как на деревню дедушке, а ну как он в следующий раз зайдёт как Пыль1234 и соответственно никакого личного письма не увидит? а e-mail его мне неизвестен. так что остаётся только чат.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Да у меня батарейка сдохла в датчике.
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
А вот сдохнет батарейка/оторвётся питало от БП/сгорит импульный преобразователь в БП у супер-пупер электрозамка, который руками никак не открыть и всё, баста, карапузики! Дядьки из МЧС с болгаркой в помощь?
Mac Safari
 Москва
2
0
id
Учитывая, что батарейка померла аж в прошлом сентябре, и унылое зрелище мумифицированной погоды на каждой из страниц дневника нисколько его не колышит...
... Кхм... Предположу, что мы зря тут напрягаемся. "Ресурс", понимаешь, "надежность"... Ну заклинит у него замок - так просто будет полгода лазить в окно, пока не представится случай его починить, вот и всего делов.
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
А его это и не должно колыхать никак, температуру в Чертаново он может и у себя за окном на термометре посмотреть. Вот Vadimus из Канады, Михаил из Боулдера штат Колорадо, Пашка из Израиля и прочие поуехавшие уже который месяц плачут горючими слезами не имея никакой возможности узнать сколько там градусов выше или ниже ноля в далёком Чертаново.
Linux Ubuntu Firefox
 Москва
1
0
Leonid Kaganov
И ключ. Сломается железный ключ на связке у родителей.
Linux Firefox
 Москва
0
0
просто Фыва Jr Олдж
Про это я уже говорил вот тут: http://lleo.me/dnevnik/2017/05/04.html#243635
Windows Safari Chrome
 Санкт-Петербург
0
0
Tarn
Ну, а если метеорит упадет с неба.
Или, например, марсиане на танке
ворвутся в его прекрасный город
и из бластеров стрельбу откроют.

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

(c) Вася Ложкин
Windows Firefox
 Швеция
0
0
Dust (#6778031)
У меня был как раз этот случай. МЧС с болгаркой, это крайний случай, когда я не продублировал и электрику и механическое открытие. Рассказать как нынче сделал механическое открытие без личинки для ключа не могу прилюдно. Замок похожий на новый замок Ллео, у меня был, попроще, с ригелями и без моторчика. На сегодя моё ИМХО накладной таки лучше чем врезной, главное раз в год набить солидолом, и аккум поменять. Да, замок шумный. Доводчика у меня нет.
Linux Ubuntu Firefox
 Москва
1
0
Leonid Kaganov
> Рассказать как нынче сделал механическое открытие без личинки для ключа не могу прилюдно.
> Да, замок шумный.

Дырочку просверлил и тонкой спицей отщелкиваешь эту извечную поеботу дурацкой конструкции CISA? :)

Замок должен иметь механический ключ на аварийный случай. Точка. Мало ли что там заест или сгорит моторчик/сонленоид?
Windows Firefox
 Израиль
3
0
Павел бывший Пашка
Да что вы все о кнопке: поставьте маленький китайский магнитик и самый маленький китайский геркончик. Это порядка на четыре надежней китайской же кнопки. А на малых токах и на пять.
Оптопару не советую - паутина там, дохлый тараканчик, просто пыль... Диод Холла можно б, но это лишний изъеб. Геркон прослужит дольше замка и дольше дома.
Windows Safari Chrome
 Челябинск
0
0
vinny-the-poo
Вы ничего не понимаете своим приземлённым рациональным умом. Настоящему энтузиасту надо не понадёжнее, а похитровыебаннее, да с приподвывертом желательно.
Windows Safari Chrome
 Москва
1
0
Sav
FLT_push - это адъ. Нельзя делать FLT_D[FLT_lag]=x; если буфер объявлен как int FLT_D[FLT_lag], это уже за границами массива, да и за границами всех этих meanов и stddов. Я бы сделал буфер кольцевым, чтобы каждый раз его не перемещать. На худой конец, перемещать можно memcpy.
Linux Ubuntu Firefox
 Москва
0
0
Leonid Kaganov
Я тоже так сказал Чуку. У меня-то в модельке на PHP изначально были push/pop на тамошнем местном языке работы с массивами - от того и название функции.

Но он возразил, что в нашем случае речь идет о массивах в 5-20 значений, поэтому быстрее и надежнее будет его перемещать, чем городить кольцевой буффер. Тут я не нашелся, что возразить.
Linux Firefox
 Москва
0
0
Чук
Кстати, кольцевой буфер очень даже можно. Даже без всяких push/pop. Для вычисления среднего и СКО порядок значений не важен, а реализовать запись текущего значения "по кругу" можно просто и незатратно.
Linux Firefox
 Boulder
0
0
Михаил (#1684620)
Сигналоанализаторы хреновы...

Среднее и дисперсия вычисляются примерно так (считаем, что тип данных достаточно большой — 32-bit int или float — чтобы переполнения не было):

sum -= buf[index];
sum2 -= sq(buf[index]);
buf[index] = sample;
sum += sample;
sum2 += sq(sample);
index = (index + 1) % buflen; // можно через if, если быстрее (или &, если buflen = 2^n)

после этого будут обновлённые значения:

среднее = sum / buflen
дисперсия = (buflen × sum2 − sq(sum)) / (buflen − 1)

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

if (sq(sample * buflen - sum) > thr * (buflen * sum2 - sq(sum))) { ... }

где thr = порог² × buflen / (buflen − 1), порог — в единицах стандартного отклонения.
Linux Safari Chrome
 Москва
0
0
Leonid Kaganov
Михаил, это хорошо и наверно имеет смысл реализовать перфекционизма и красоты ради, но, положа руку на сердце, чем вызвано? У вас есть основания считать, что процессор 8266 плохо справляется с целочисленной арифметикой на 5-10 значениях каждые 200 мс?
Windows Firefox
 Москва
0
0
Johny----------- (#6761238)
Что не сделает Лео чтоб не покупать нормальный Abloy / Cisa / mottura , в которых уже и контакты все нужные где надо стоят и конструкция оттестирована сотнями тысяч хомячков.

всего комментариев: 262

<< предыдущая заметка следующая заметка >>