Arduino ดิจิตอลอ่านผิด


10

ฉันตั้งค่า Arduino UNO ของฉันด้วยสายอินพุต 4 เส้นพวกเขาเชื่อมต่อกับพอร์ต 10, 11, 12, 13 พวกเขาเชื่อมต่อกับเขียงหั่นขนมของฉันโดยไม่มีอะไรเหลืออยู่นอกจากสายไฟ

รหัสของฉันจะเป็น:

Serial.println(digitalRead(13));
Serial.println(digitalRead(12));
Serial.println(digitalRead(11));
Serial.println(digitalRead(10));

สิ่งนี้คือหลังจากที่ฉันเชื่อมต่อพินกับ 5V หรือ 3V3 สั้น ๆ การอ่านจะเริ่มเป็นบ้าอย่างเช่น: 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 โดยไม่รู้สึกอะไร! โดยไม่ต้องมีสายเชื่อมต่อโดยตรงกับ VCC ของฉัน (5V หรือ 3V3) การอ่านจะเปลี่ยนแปลงตลอดเวลาเมื่อมันควรจะเป็นศูนย์!

Arduino ของฉันตายหรือไม่ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


เพียงแค่เชื่อมต่อพินทริกเกอร์ของคุณกับพื้นดินเมื่อไม่ได้ถูกเรียก!

คำตอบ:


18

สิ่งที่คุณมีเรียกว่าFloatingพิน Digital Input pins มีความไวต่อการเปลี่ยนแปลงมากและหากไม่ได้รับการผลักดันบวกไปยังสถานะหนึ่งหรืออีกสถานะหนึ่ง (สูงหรือต่ำ) จะรับความจุหลงทางจากแหล่งใกล้เคียงเช่นเขียงเขี้ยวนิ้วมือมนุษย์หรือแม้แต่อากาศ สายใด ๆ ที่เชื่อมต่อกับมันจะทำตัวเหมือนเสาอากาศเล็กน้อยและทำให้สถานะอินพุตเปลี่ยนไป และฉันหมายถึงสายใด ๆ ร่องรอยบนกระดานลวดไปยังเขียงหั่นขนมปิ่นเขียงหรือแม้แต่หมุดโลหะของ IC เอง

สิ่งนี้อ้างอิงถึงในหน้าอ้างอิงของ Arduino:

หากพินไม่ได้เชื่อมต่อกับสิ่งใด ๆ digitalRead () สามารถส่งคืน HIGH หรือ LOW (และสามารถเปลี่ยนได้แบบสุ่ม)

หากคุณดูที่Arduino Digital Pin Tutorial :

อย่างไรก็ตามสิ่งนี้ยังหมายถึงว่าหมุดป้อนข้อมูลที่ไม่มีอะไรเชื่อมต่อกับพวกเขาหรือสายเชื่อมต่อกับพวกเขาที่ไม่ได้เชื่อมต่อกับวงจรอื่น ๆ จะรายงานการเปลี่ยนแปลงแบบสุ่มในสถานะพินการรับสัญญาณไฟฟ้าจากสภาพแวดล้อม ของหมุดใกล้เคียง

บ่อยครั้งที่มีประโยชน์ในการคัดพินอินพุตไปยังสถานะที่รู้จักหากไม่มีอินพุตอยู่ สิ่งนี้สามารถทำได้โดยการเพิ่มตัวต้านทาน pullup (ถึง + 5V) หรือตัวต้านทานแบบเลื่อนลง (ตัวต้านทานลงกราวด์) บนอินพุตโดยที่ 10K เป็นค่าทั่วไป นอกจากนี้ยังมีตัวต้านทาน pullup ขนาด 20K ที่สร้างขึ้นในชิป Atmega ที่สามารถเข้าถึงได้จากซอฟต์แวร์ ตัวต้านทานแบบดึงขึ้นในตัวเหล่านี้เข้าถึงได้ในลักษณะดังต่อไปนี้

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

ตัวต้านทานแรงดึงแบบอ่อนเหล่านี้บังคับให้รัฐพินอินพุตเข้าสู่สถานะที่รู้จักและสามารถเขียนทับได้ง่ายด้วยแรงดันไฟฟ้าอินพุตที่แรงขึ้นเช่นการเชื่อมต่อโดยตรงกับกราวด์หรือ + 5v


2
วิธีการพูดถึงpinMode(pin, INPUT_PULLUP)? ง่ายต่อการจดจำและยากที่จะพลาด
piojo

6

นี่เป็นปกติ. หากไม่มีการเชื่อมต่ออินพุตกับบางสิ่งมันจะแสดงสูงหรือต่ำหรือเปลี่ยนแปลงตลอดเวลา นี่คือคำอธิบายโดยหน้าดิจิตอลอ่านอ่านบนเว็บไซต์ Arduino

ขาอินพุตทำงานโดยมีความจุเล็กน้อยดังนั้นการเชื่อมต่อกับ 3V3 หรือ 5V สั้น ๆ จะชาร์จประจุ คุณอาจพบผลที่คล้ายกันโดยใช้นิ้วมือเปล่า

คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการเพิ่มตัวต้านทานค่าขนาดใหญ่ระหว่างพินและ GND

ถามตัวคุณเองว่าทำไมคุณถึงคาดหวังให้เป็นศูนย์?


1
pinMode (พิน INPUT_PULLUP);
jippie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.