极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 最帅的老饼

新手做第一个ARDUINO 应用项目

[复制链接]
发表于 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 的旁路電容都是有好处的。能这样理解吗?
对于电子我是小白。
旁路电容有要求类型吗?
谢谢!!
回复 支持 反对

使用道具 举报

发表于 2017-10-7 22:27:50 | 显示全部楼层
本帖最后由 galaxy 于 2017-10-7 23:06 编辑

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

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

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-8 13:02:12 | 显示全部楼层
galaxy 发表于 2017-10-7 22:27
旁路電容常用的為 0.1μF (正確的標示法 ~ μF)
用在電機上消除火花的旁路電容常用的為 "陶瓷電容" ,
因 ...

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

使用道具 举报

发表于 2017-10-8 13:09:13 | 显示全部楼层
本帖最后由 galaxy 于 2017-10-8 13:18 编辑

教學相長
期待您完工的好消息
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)  读取电位器值经常出错,要想办法修改代码。
回复 支持 反对

使用道具 举报

发表于 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 查一下圖片就知道了~~
回复 支持 反对

使用道具 举报

发表于 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 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = { 2, 3, 4, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 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[6]={0};
char z[6] = { '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[j] = qey [ j+1 ];
                                                   }
                                             i = 5 ;  //把i = 5 ,等代 qey[5] 的装入。
                                      }
           qey = key ;      // 把key中的char 装进数组qey
         //  Serial.print('*');
           Buzzer();
           i++;
           }
         
          if (  key == '#' ){          //输入#后,进行数组的比较。
          //   Serial.println("");
                for ( byte j = 0 ; j < 6 ; j++ ){
           //      Serial.print( qey[j] );
                       }
              //   Serial.println("");
                  
                    if ( qey[0] == z[0] && qey[1] == z[1] && qey[2] == z[2] && qey[3] == z[3] &&
                         qey[4] == z[4] && qey[5] == z[5] ){   // 进行数组的比较。

                                                     //  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[j] = 0 ;
                              }
                       }        
           }

          if ( (millis( ) - Time ) > 10000 && T == 1 ){      //按键停10秒就清空内存中的密码和关灯。
             for ( byte j = 0 ; j < 6 ; j++ ){
                     qey[j] = 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 );
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 03:20 , Processed in 0.057796 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表