वहाँ एक I2C लाइब्रेरी है


12

क्या C ++ के लिए I2C से बात करने के लिए एक साधारण पुस्तकालय है? मुझे अजगर और जावा के लिए कुछ सामान मिला है, लेकिन मैं सी ++ चाहता था। मैं उम्मीद कर रहा था कि किसी ने Arduino वायर लाइब्रेरी पोर्ट की है, इसलिए मैं कोड का उपयोग कर सकता हूं जो मैंने पहले ही Arduino के लिए लिखा है।



1
असहमत ... मैं वास्तव में पूछ रहा हूं कि क्या अरुडिनो वायरिंग लाइब्रेरी को पाई पर रखा गया था ताकि मैं पाई पर आसानी से Arduino के लिए लिखे गए कोड का उपयोग कर सकूं। ऐसा नहीं लगता है, इसलिए किसी भी समकक्ष, पुस्तकालय का उपयोग करना आसान होगा। हालाँकि, यह भी प्रतीत नहीं होता है, इसलिए मुझे i2c-dev कोड का उपयोग करने के लिए छोड़ दिया गया है।
केविन

जवाबों:


7

लिनक्स यूजरस्पेस में i2c-dev हेडर है। मुझे याद नहीं है कि क्या यह हेडर एलएम-सेंसर पैकेज के साथ भेजा गया है, या यदि इसे स्रोत से स्थापित करने की आवश्यकता है। मैं आपके डिस्ट्रो के पैकेज रिपॉजिटरी की जांच करूंगा। xGoat में तैयारी और उपयोग को कवर करने वाला एक अच्छा लेख है।

#include <linux/i2c-dev.h>
/*
  Including i2c-dev header will allow the following I2C SMBus functions
  - i2c_smbus_access
  - i2c_smbus_write_quick
  - i2c_smbus_read_byte
  - i2c_smbus_write_byte
  - i2c_smbus_read_byte_data
  - i2c_smbus_write_byte_data
  - i2c_smbus_read_word_data
  - i2c_smbus_write_word_data
  - i2c_smbus_process_call
  - i2c_smbus_read_block_data
  - i2c_smbus_write_block_data
  - i2c_smbus_read_i2c_block_data
  - i2c_smbus_write_i2c_block_data
  - i2c_smbus_block_process_call
*/

I2c-tools ( डाउनलोड ) के लिए स्रोत कोड में अच्छे उदाहरण हैं C। मैंने C++इन कार्यों को लपेटते हुए कुछ सरल पुस्तकालयों को देखा है । मैं आपकी आवश्यकताओं के अनुरूप अपनी खुद की लाइब्रेरी संलेखन करने की सलाह दूंगा। अन्य महान उदाहरण इस I2CBus पुस्तकालय की तरह, गितुब पर पाए जा सकते हैं


5

मैंने अभी पिगियो लाइब्रेरी का उपयोग करना शुरू किया है और मैं बहुत प्रभावित हूं। मुझे विशेष रूप से बिट बैंग मोड पसंद है, क्योंकि यह आपको I2C इंटरफ़ेस के रूप में किसी भी दो GPIO पिन का उपयोग करने की अनुमति देता है, जब तक कि उनके पास पुलअप प्रतिरोधक होते हैं। यदि आप पीआई 2 का उपयोग कर रहे हैं, तो बिट को पीटने का नुकसान नहीं है, क्योंकि आपके पास 4 सीपीयू हैं। बिट बैंग कमांड के बारे में अच्छी बात यह है कि वे कमांड बाइट्स के "एड्रेस, राइट, डेटा, रीड, स्टार्ट, स्टॉप" की एक सूची लेते हैं ताकि आप एक कॉल के साथ कई I / Os चला सकें। यह केवल एक चीज है जो मैंने पाया है कि मज़बूती से बार-बार शुरू होने वाले लेनदेन को चलाता है, जो कई उपकरणों द्वारा आवश्यक होते हैं जो एक रीड कमांड के शुरू में रजिस्टर नंबर लेते हैं। पुस्तकालय अच्छी तरह से प्रलेखित है और उपयोग में आसान है।

नीचे परीक्षण कार्यक्रम है जो एक MAX31785 पर तापमान रजिस्टर पढ़ता है। 4 अगले बाइट के साथ पता सेट करता है, 2 = शुरू, 7 = लिखो जिसके बाद एक बाइट काउंट और डेटा बाइट्स, 3 = स्टॉप, 6 = पढ़ा जाता है जो एक बाइट काउंट होता है। कॉल किसी भी डेटा बाइट्स को बाइट्स की संख्या के साथ पढ़ता है।

#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>

#define MAX31785_TEMP_REG 0x8D
#define MAX31785_TEMP0 6
#define MAX31785_TEMP_INT 12
#define PAGE_REG_OFFSET 6  // Offset in CmdBuf of the page register write value


main( int argc, char *argv[])
{
    int  rcnt;
    char ReadBuf[256];
    char CmdBuf[] = {4, 0x52,  // Chip address
                       2, 7, 2, 0x00, MAX31785_TEMP0, 3,    // Write page register to select temperature sensor
                       2, 7, 1, MAX31785_TEMP_REG, 2, 6, 2, 3, // Read temperature register
                       0 // EOL
                       };

  if (gpioInitialise() < 0) return 1;

  // Open bit banging I2C on standard I2C pins
  if (bbI2COpen(2, 3, 100000)) return 1;

  while(1)
  {
    // Loop over the 7 temp sensors
      for(CmdBuf[PAGE_REG_OFFSET] = MAX31785_TEMP0; CmdBuf[PAGE_REG_OFFSET] <= MAX31785_TEMP_INT; CmdBuf[PAGE_REG_OFFSET]++)  
      {     
    // Read the temp reg for the current page
          rcnt = bbI2CZip(2, CmdBuf, sizeof(CmdBuf), ReadBuf, sizeof(ReadBuf));

          if(rcnt == 2)
            // Print out degrees C
            printf("%2.1f ", (short)(((ReadBuf[1] << 8) | ReadBuf[0]) + 50)/100.0 );
          else
            printf("Error: %d\n", rcnt);
      }

    printf("\n");
    fflush(stdout);
    sleep(1);
  }

  bbI2CClose(2);

  gpioTerminate();
}

crj11, अपना कोड उदाहरण पोस्ट करने के लिए धन्यवाद। यह सबसे अच्छा उदाहरण था जो मुझे खोजने और मुझे सही रास्ते पर लाने में सक्षम था। एकमात्र समस्या जो मुझे इसके साथ थी, वह pigpiod_if.h लाइब्रेरी का उपयोग करके थी, जिसमें कोड को सुडो के रूप में चलाने की आवश्यकता थी, जो कि मेरे प्रोजेक्ट के लिए स्वीकार्य नहीं था। मैं पिगपियोड_इफ़ 2.एच लाइब्रेरी में जाने और कुछ ट्विक बनाने में सक्षम था और यह एक चैंबर की तरह चलता था।
रिचर्ड टीएल

2

जैसा कि emcconville ने उल्लेख किया है कि लिनक्स यूजरस्पेस ( #include <linux/i2c-dev.h>) में एक i2c-dev हैडर है । इसके अलावा आपको पढ़ने के लिए एक चरित्र उपकरण की आवश्यकता है। यह सही मॉड्यूल लोड करके किया जा सकता है। i2c_bcm2708निम्न स्तर के ड्राइवर के लिए और i2c-devबूस के लिए चरित्र का निर्माण करने के लिए। लागू ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

मक्खी पर उन्हें लोड करने के लिए। लागू ...

sudo sh -c 'echo "i2c-dev" >> /etc/modules'
sudo sh -c 'echo "options i2c_bcm2708 baudrate=<your preferred baudrate>\n" > /etc/modprobe.d/custom.conf

और unblacklist i2c_bcm2708में /etc/modprobe.d/raspi-blacklist.confबनाने के लिए /dev/i2c-0और /dev/i2c-1स्थायी रूप से दिखाई देते हैं।

अब से आप I delC डेल मेस्ट्रो का उपयोग करने के बारे में संकेत का पालन कर सकते हैं ।

मैं इस विधि को पसंद करता हूं क्योंकि यह प्लेटफ़ॉर्नास्टिक है। linux/i2c-dev.hजब तक कोई I driverC ड्राइवर मौजूद है, तब तक आप अन्य उपकरणों के साथ भी उपयोग कर सकते हैं । WiringPi rPi के लिए बाध्य है।

सादर

अपडेट करें:

यह जानकारी पदावनत है। डिवाइस पेड़ों के उपयोग के लिए इस पोस्ट की जाँच करें


0

एक WiringPi है जो मुझे लगता है कि वास्तव में आप क्या चाहते हैं। पास्कल, जावा, पायथन, पर्ल, टीसीएल और रूबी के लिए भी रैपर हैं। इसके अतिरिक्त, कोई व्यक्ति समान लिंक का पता लगाना चाहेगा:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0

नहीं ... फिर से देखो, यह i2c नहीं करता है, बस बुनियादी पिन कार्य करता है। परियोजना को कुछ भ्रामक नाम दिया गया है। आपके पहले लिंक में कुछ अच्छे c कोड हैं, लेकिन Arduino की तरह i2c करने के लिए एक साधारण आवरण नहीं है। मुझे शायद इसे खुद लिखना होगा।
केविन

3
WiringPi I2C लाइब्रेरी: wiringpi.com/reference/i2c-library
avra
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.