galaxy 发表于 2017-10-7 15:53:54

最帅的老饼 发表于 2017-10-7 13:33
因为你的回复,我专门去查了下舵机的控制机制。
50Hz信号脉冲宽度 1.25 毫秒 为 0度1.75 毫秒为 180 ...

我再回頭看了您 在 12 樓,及 13 樓 所 PO 的照片....

舵機使用的電機是有刷電機,這是最大的雜訊來源處

最帅的老饼 发表于 2017-10-7 17:53:05

galaxy 发表于 2017-10-7 15:53
我再回頭看了您 在 12 樓,及 13 樓 所 PO 的照片....

舵機使用的電機是有刷電機,這是最大的雜訊來源處

安装只0.1u 的旁路電容都是有好处的。能这样理解吗?
对于电子我是小白。
旁路电容有要求类型吗?
谢谢!!

galaxy 发表于 2017-10-7 22:27:50

本帖最后由 galaxy 于 2017-10-7 23:06 编辑

旁路電容常用的為 0.1μF (正確的標示法 ~ μF)
用在電機上消除火花的旁路電容常用的為 "陶瓷電容" ,
因陶瓷電容的高頻響應良好,用來消除雜訊最適合

陶瓷電容為無極性電容,最適合用在電機上,(惟注意耐壓問題,常見的耐壓為 25V~50V)
1. 第一顆的 一腳接電機的 + 端 , 另一腳接電機的外殼
2. 第二顆的 一腳接電機的 -端 , 另一腳接電機的外殼
3. 第三顆的 一腳接電機的 + 端 , 另一腳接電機的 - 端
4. 因電機的外殼是鐵很難上錫,必須要用砂紙在鐵殼上磨個精亮,才好上錫,
    不然冷銲或假銲,都會造成日後的誤動作 (銲接要確實)

這樣的接法是最保險的接法了

(不可使用有極性的電解電容,萬一電機在逆轉時~極性也跟著逆接,這時電解電容會爆的)

最帅的老饼 发表于 2017-10-8 13:02:12

galaxy 发表于 2017-10-7 22:27
旁路電容常用的為 0.1μF (正確的標示法 ~ μF)
用在電機上消除火花的旁路電容常用的為 "陶瓷電容" ,
因 ...

以前只知道一只接电机的两端。
你的回复又刷新我对旁路电容的认识。
多谢你!!

galaxy 发表于 2017-10-8 13:09:13

本帖最后由 galaxy 于 2017-10-8 13:18 编辑

教學相長:)
期待您完工的好消息:D

最帅的老饼 发表于 2017-10-8 19:02:41

galaxy 发表于 2017-10-8 13:09
教學相長
期待您完工的好消息

左门基本搞好,长假后很多事情要忙,忙完才能造右门的门机,
我去研究下如何发视频,搞个视骤上来。

最帅的老饼 发表于 2017-10-20 17:39:19

工程完成得差不多了,已经发现及解决了不少问题。下面先做个问题小结:
1. 做工程,特别是只有自己一个人做的工程,必须要增量开发。
    完成一步增加一步,否则你要备好头痛药。
2. 物理世界是有偏差的。按键要做去抖动很多人知道,电位器等其它外部输入设备同样会抖动,同样需要想办法去抖动。(我就因为没想到电位器输入抖动,搞到脑袋冒烟多天。)
3.很多人说 C语言是面向过程开发,这是错的。Arduino中的 loop(){.......} 不是循环这么简单,我理解它的意义是《面向对象开发》。记下这句话,独力去开发一套系统,当吃几天头痛药后你就会理解。

最帅的老饼 发表于 2017-10-23 16:35:52

本帖最后由 最帅的老饼 于 2017-10-23 16:42 编辑

经过多天测试,发现analogRead(A0)读取电位器值经常出错,要想办法修改代码。

galaxy 发表于 2017-10-26 21:02:24

本帖最后由 galaxy 于 2017-10-27 08:26 编辑

最帅的老饼 发表于 2017-10-23 16:35
经过多天测试,发现analogRead(A0)读取电位器值经常出错,要想办法修改代码。

看了您第21樓的照片:
裸露在室外的電位器,這會產生很多問題的

1.電位器是很容易老化的零件,您這又擺在室外 (風吹,日曬,雨打,下雪,加上濕氣)這都是致命傷。

EX : 有遇過家裡的收音機調個音量鈕就 擦擦擦 的響吧 ?
       那就是電位器老了 (通常噴 WD40 可解決,但不久又會發生)

       您目前遇到的問題就是這樣!   

2.排除上述的因素 :
   電位器的金屬外殼有接地 ?
   從電位器的輸出接到 analogRead (A0) 的這段線是否用隔離線?
   (隔離線的地也要接好)

   因為這段這麼長的距離,若不用隔離線....很難保證雜訊不會竄入 !!

3.這個環結不建議用 電位器 來當感應裝置 (不穩定因素太多了)
   過去我曾經看過生產線用的感應裝置,就是沒看過用電位器的~

4.建議您用 "測速碼盤" 這種計數裝置來感應門目前開多大;幾度...
用 測速碼盤 問題會比較小。
要注意的是 測速碼盤 要隨時保持乾淨,不然計數錯了就不好了~~

測速碼盤您可以 google 查一下圖片就知道了~~

suoma 发表于 2017-11-19 09:23:48

发现analogRead(A0)读取电位器值经常出错
先不接电位器看下A0输出,记得手一碰有300-500偏差,然后软件减去A0空载输出模拟值,建议将arduino保存在密封环境中

最帅老饼 发表于 2018-1-6 17:44:42

本帖最后由 最帅老饼 于 2018-1-7 21:44 编辑

“最帅的老饼”密码找回了,那“最帅老饼”先下线吧。
谢谢版主的帮忙。

最帅的老饼 发表于 2018-1-7 21:41:57

galaxy 发表于 2017-10-26 21:02
看了您第21樓的照片:
裸露在室外的電位器,這會產生很多問題的



多谢你的回复。
我的电动门用analogRead () 读取模似值已经测试了不少于 2个月了。
大多数时候是能正常工作的,但有时会出现一次半次的故障。
其间我更换过 20+元 的电位器,又更换过 90+ 元 霍尔磁感器,但还是会出现故障。

以下是工作的核心代码

// 电机起动的代码省略
tone ( 7, 30000 );    //脉冲给工业步进电机驱动器,这时门是在开或者关的过程中。
while ( 1 ){            //进入循环
         if ( analogRead (A0) > 300 ){   //不断检查电位器的值
                           break ;                  //门到达位置跳出循环
                                 }
                                 }
tone ( 7, 2000,300 );          //开始减速
// 减速的代码省略。

故障情况是,要么早早跳出循环门还没到位就减速,要么迟迟不跳出循环门高速撞门框。
就在前两天,我加进了 analogReferece ( EXTERNAL )函数 ,并且把电位器的电源引入 主板的 AREF

还把代码改了一下,如下:
// 电机起动的代码省略
tone ( 7, 30000 );    //脉冲给工业步进电机驱动器,这时门是在开或者关的过程中。
while ( 1 ){            //进入循环
         if ( analogRead (A0) > 300 ){   //不断检查电位器的值
                delay (10 ) ;
                if ( analogRead (A0) > 300 ){
                           break ;                  //门到达位置跳出循环
                                 }
                                 }
                                 }
tone ( 7, 2000,300 );          //开始减速
// 减速的代码省略。

经过以上的处理,这三天暂时没出现故障。
感觉困扰我几个月的问题看到了一丝睹光。

最帅的老饼 发表于 2018-1-7 21:54:36

今天下了整天雨,电动门的两部步进电机、两只用于开关插销的直流电机、4只感应开关,两只读取门位置的电位器全部冒着雨正常工作。我可以确定 analogReferece ( EXTERNAL ) 函数 是有用的。

最帅的老饼 发表于 2018-1-7 21:57:49

本帖最后由 最帅的老饼 于 2018-1-7 21:59 编辑

下一步工作在门外装个密码键盘。

最帅的老饼 发表于 2018-1-7 22:02:41

本帖最后由 最帅的老饼 于 2018-1-7 22:25 编辑

以下是写了一整天的密码盘代码,代码说明如下:
1.代码用到 <Keypad.h> , 是4 行 3列 排线键盘, { 2, 3, 4, 5} { 8, 7, 6},9号脚是蜂鸣器
2.设置了'#' 为输入键
3.输入正确密码:80*123#//输入正确密码主板就通过 I2C 发送字符 'A' 关且在1秒后关闭LED
4.密码可以无限按键,只取'#'的前6位有效。
5.只要触动按键就打开键盘的背光LED
6.在输入过程中,只要超过10秒不动就把前面的输入清除且关闭LED
7.连续输入5次错误密码,锁键盘 900秒。

#include <Wire.h>
#include <Keypad.h>

#define BuzzerPin 9      //蜂鸣器脚
#define pinOUT 10          // 密码正确的输出脚
#define led 11             //键盘LED 脚
#define ErTime 900000   //输入五次错误的锁盘时间

unsigned long Time = 0 ;
boolean T = 0 ;
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins = { 2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins = { 8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void Buzzer();
void Buzzer2();
void Buzzer3();
char qey={0};
char z = { '8','0','*','1','2','3'};
byte i = 0 ;
byte Error = 0 ;
unsigned long errorTime = 0 ;

void setup(){
// Serial.begin(9600);
Wire.begin ();
pinMode ( BuzzerPin ,OUTPUT);
pinMode ( pinOUT ,OUTPUT);
pinMode ( led ,OUTPUT);
}

void loop(){
char key = keypad.getKey();    //调用函数把按键读进 char key。
if ( key ){
         Time = millis();
         T = 1 ;
         digitalWrite ( led , HIGH );
         if ( key != '#'){   //当输入的char不是#时 ,把输入的char 装进数组。
                              if ( i == 6 ){                     //当i == 5 时,把数组的后5个char 向前移动一位。
                                           for ( byte j = 0 ; j < 5 ; j++ ){
                                             qey = qey [ j+1 ];
                                                   }
                                             i = 5 ;//把i = 5 ,等代 qey 的装入。
                                    }
         qey = key ;      // 把key中的char 装进数组qey
         //Serial.print('*');
         Buzzer();
         i++;
         }
         
          if (key == '#' ){          //输入#后,进行数组的比较。
          //   Serial.println("");
                for ( byte j = 0 ; j < 6 ; j++ ){
         //      Serial.print( qey );
                     }
            //   Serial.println("");
                  
                  if ( qey == z && qey == z && qey == z && qey == z &&
                         qey == z && qey == z ){   // 进行数组的比较。

                                                   //Serial.println("");
                                                    //   Serial.println("Correct password.");
                                                    //   Serial.println("");
                                                       Wire.beginTransmission ( 3 ) ;//输出
                                                       Wire.write ( 'A');
                                                       Wire.endTransmission ();
                                                      
                                                       Buzzer2();
                                                       delay ( 1000 );
                                                       digitalWrite ( led , LOW );
                                                       T = 0 ;
                                                       Error = 0 ;
                                                      
                                                    }else{      
                                                       Buzzer3();
                                                //   Serial.println("");
                                                //   Serial.println("Password error.");
                                                //   Serial.println("");
                                                       Error ++ ;
                                                   //   Serial.print("Error=");
                                                   //   Serial.println( Error );
                                                    }
               
               
               i = 0 ;
               for ( byte j = 0 ; j < 6 ; j++ ){
                     qey = 0 ;
                              }
                     }      
         }

          if ( (millis( ) - Time ) > 10000 && T == 1 ){      //按键停10秒就清空内存中的密码和关灯。
             for ( byte j = 0 ; j < 6 ; j++ ){
                     qey = 0 ;
                              }
                               Buzzer3();
                               digitalWrite ( led , LOW );
                               T = 0 ;
                               }

                              
if ( Error > 4 ){            //密码连续输错5次就锁键盘15秒。
      errorTime = millis();
      digitalWrite ( led , LOW );
      T = 0 ;
      while ( ( millis ( ) - errorTime ) < ErTime ){
      ;
      }
      Error = 0 ;
}
         
}//Loop


void Buzzer3(){
for(byte x = 0 ; x < 3 ; x++){
digitalWrite( BuzzerPin ,HIGH );
delay (30);
digitalWrite( BuzzerPin ,LOW );
delay (50);
}
}

void Buzzer2(){
digitalWrite( BuzzerPin ,HIGH );
delay (500);
digitalWrite( BuzzerPin ,LOW );
}

void Buzzer(){
digitalWrite( BuzzerPin ,HIGH );
delay (100);
digitalWrite( BuzzerPin ,LOW );
}
页: 1 2 [3] 4
查看完整版本: 新手做第一个ARDUINO 应用项目