Robofun 機器人論壇

標題: [請益]超音波 SRF10*SRF08*PING超音波感測器 [打印本頁]

作者: robot2009    時間: 2010-2-8 22:05
標題: [請益]超音波 SRF10*SRF08*PING超音波感測器
請問大家,有使用過這三顆超音波嗎?!

srf08與srf10的code應該一樣八~

於是今天拿了SRF10 拿了他的srf08的example來測!!

我使用的是visual studio 2008- mfc 他的範例能直接轉~!!
他example 原本應該是vc6.0八~ 我也不是很清楚!!

重點是我測量出來結果很差...大改頂多能測到 5x 公分

不知道是本身srf10的問題!!還是example的問題!! 請大家幫忙解惑!!

我也用過BASIC STAMP 的軟體 搭它的PING超音波感測器 結果是比SRF10好!~
但是明明就SRF10能測的範圍就遠.

PING超音波感測器 --->範圍: 2cm to 3M
SRF10--->範圍 : 3cm 到 6M

Q1.這三顆的差別?!
Q2.如果大家在要量測距離的情況下!! 會選用的SENSOR?!(如果可以,能大約說一下價格嗎?!!)
PS.會好是能有MFC範例的~這樣比較好上手-.-
作者: robot2009    時間: 2010-2-8 22:30
補充一下:
(1)我使用的srf10是搭配 是透過usb to i2c 那個轉usb的座
(2)我是用的線大約快一公尺...忽然想到這應該會影響量測的距離八= =+!?
作者: mzw2008    時間: 2010-2-8 23:14
我用過覺得ping比較好耶
還滿精確, 且速度不慢
不過距離不夠遠是缺點

用的線大約快一公尺...這是什麼意思?!
你幹嘛簽這麼長的線?!
作者: robot2009    時間: 2010-2-8 23:33
PING 如果要使用其他方式來用 能透過NI這塊資料擷取卡嗎?!!

BS2的RAM太小了= =+!! 變數如果用WORD 一下就爆掉了= =+!

其他塊晶片RAM也是一樣只有38 BYTE. 請問一下BS2p-40->[Scratch Pad RAM-128BYTE]這是指什@@?!

回歸正題!! 用那麼長的線是因為學長給我時就那麼長= =+!!

跟長度有關對八?@@  是不是本身srf10就不精準阿?!
作者: robot2009    時間: 2010-2-8 23:34
補充一下!!
我用的是轉usb那種線!! 一公尺長!~~

因為不會貼圖= = 所以不能拍給你看~~
作者: mzw2008    時間: 2010-2-9 00:14
要貼圖得先發文章...然後編輯自己的文章就可以貼

不過感覺和線沒有關係
剛剛立刻用兩公尺的線去接超音波也沒怎樣

一下子就爆掉是怎麼回事?
怎麼可能才接個超音波就能爆? 這有點匪疑所思喔
像我接arduino, 丟著跑整天也沒爆, 他記憶體也才幾K啊
你到底程式如何寫的啊
作者: mzw2008    時間: 2010-2-9 00:59
另外你只能量到50cm有點怪
那ping有試過可量多少呢
我量3~400都是OK的哩

code 是不是貼出來看一下呢?
作者: mac1    時間: 2010-2-9 13:35
距離應該跟 gain 有關係
看看code 或是硬體什麼地方可以調整 gain的 試試看
作者: robot2009    時間: 2010-2-9 14:43
mzw2008 大 我說的爆掉是指 顯示的值會爆衝= =+
不是真的燒掉@@ (用詞不當,sorry)
那個code就是srf08的範例!!~
// USB_I2C_SRF08.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "USB_I2C_SRF08.h"
#include "USB_I2C_SRF08Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CUSB_I2C_SRF08App

BEGIN_MESSAGE_MAP(CUSB_I2C_SRF08App, CWinApp)
        //{{AFX_MSG_MAP(CUSB_I2C_SRF08App)
                // NOTE - the ClassWizard will add and remove mapping macros here.
                //    DO NOT EDIT what you see in these blocks of generated code!
        //}}AFX_MSG
        ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUSB_I2C_SRF08App construction

CUSB_I2C_SRF08App::CUSB_I2C_SRF08App()
{
        // TODO: add construction code here,
        // Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CUSB_I2C_SRF08App object

CUSB_I2C_SRF08App theApp;

/////////////////////////////////////////////////////////////////////////////
// CUSB_I2C_SRF08App initialization

BOOL CUSB_I2C_SRF08App::InitInstance()
{
        AfxEnableControlContainer();

        // Standard initialization
        // If you are not using these features and wish to reduce the size
        //  of your final executable, you should remove from the following
        //  the specific initialization routines you do not need.

#ifdef _AFXDLL
        Enable3dControls();                        // Call this when using MFC in a shared DLL
#else
        Enable3dControlsStatic();        // Call this when linking to MFC statically
#endif

        CUSB_I2C_SRF08Dlg dlg;
        m_pMainWnd = &dlg;
        int nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
                // TODO: Place code here to handle when the dialog is
                //  dismissed with OK
        }
        else if (nResponse == IDCANCEL)
        {
                // TODO: Place code here to handle when the dialog is
                //  dismissed with Cancel
        }

        // Since the dialog has been closed, return FALSE so that we exit the
        //  application, rather than start the application's message pump.
        return FALSE;
}

不過我用的是srf10 所以srf08的code  它的gain 可能要改!!
我在去讀一下它的資料,看看好了!!

PING可以到300多公分!!  PING是一顆發一顆收對八?!(只是想確認一下)
應該所有超因波都是一顆收一顆發八?
想問的是是一定是一顆發  一顆收
還是一顆在發 另一顆就變收!! 就是說能收又能發 要看另一顆決定?! 對嗎?!!
也就是原本硬體上有預設!!
作者: robot2009    時間: 2010-2-9 14:45
剛剛貼錯了 以下這才對!! 有人知道要改哪嗎?!!
// USB_I2C_SRF08Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "USB_I2C_SRF08.h"
#include "USB_I2C_SRF08Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define I2CD_CMD        0x53                // direct I2C control command
#define I2C_CMD                0x55                // registered I2C control command
#define CM01_CMD        0x5a                // CM01 command

enum cmds { nop=0, VERSION, NEW_ADDRESS, BATTERY,
                        SCAN1, SCAN2, SCAN3, SCAN4, SCAN6, SCAN8, SCAN12, SCAN16,
};

HANDLE hCom;
int Addr=0;
BYTE CommPort=0;

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
        CAboutDlg();

// Dialog Data
        //{{AFX_DATA(CAboutDlg)
        enum { IDD = IDD_ABOUTBOX };
        //}}AFX_DATA

        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CAboutDlg)
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
        //}}AFX_VIRTUAL

// Implementation
protected:
        //{{AFX_MSG(CAboutDlg)
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
        //{{AFX_DATA_INIT(CAboutDlg)
        //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CAboutDlg)
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
        //{{AFX_MSG_MAP(CAboutDlg)
                // No message handlers
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUSB_I2C_SRF08Dlg dialog

CUSB_I2C_SRF08Dlg::CUSB_I2C_SRF08Dlg(CWnd* pParent /*=NULL*/)
        : CDialog(CUSB_I2C_SRF08Dlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CUSB_I2C_SRF08Dlg)
                // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUSB_I2C_SRF08Dlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CUSB_I2C_SRF08Dlg)
                // NOTE: the ClassWizard will add DDX and DDV calls here
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CUSB_I2C_SRF08Dlg, CDialog)
        //{{AFX_MSG_MAP(CUSB_I2C_SRF08Dlg)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_COM1, OnCom1)
        ON_BN_CLICKED(IDC_COM2, OnCom2)
        ON_BN_CLICKED(IDC_COM3, OnCom3)
        ON_BN_CLICKED(IDC_COM4, OnCom4)
        ON_BN_CLICKED(IDC_COM5, OnCom5)
        ON_BN_CLICKED(IDC_COM6, OnCom6)
        ON_BN_CLICKED(IDC_COM7, OnCom7)
        ON_BN_CLICKED(IDC_COM8, OnCom8)
        ON_WM_TIMER()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUSB_I2C_SRF08Dlg message handlers

BOOL CUSB_I2C_SRF08Dlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // Add "About..." menu item to system menu.

        // IDM_ABOUTBOX must be in the system command range.
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);

        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
                CString strAboutMenu;
                strAboutMenu.LoadString(IDS_ABOUTBOX);
                if (!strAboutMenu.IsEmpty())
                {
                        pSysMenu->AppendMenu(MF_SEPARATOR);
                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                }
        }

        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon
       
        // TODO: Add extra initialization here
       
        CWinApp* App = AfxGetApp( );
           CommPort = App->GetProfileInt("SETTINGS","COMPORT",0);
        switch(CommPort) {
                case 1:        SetupCommPort("COM1");
                                ((CButton*)GetDlgItem(IDC_COM1))->SetCheck(1);
                                break;
                case 2:        SetupCommPort("COM2");
                                ((CButton*)GetDlgItem(IDC_COM2))->SetCheck(1);
                                break;
                case 3:        SetupCommPort("COM3");
                                ((CButton*)GetDlgItem(IDC_COM3))->SetCheck(1);
                                break;
                case 4:        SetupCommPort("COM4");
                                ((CButton*)GetDlgItem(IDC_COM4))->SetCheck(1);
                                break;
                case 5:        SetupCommPort("COM5");
                                ((CButton*)GetDlgItem(IDC_COM5))->SetCheck(1);
                                break;
                case 6:        SetupCommPort("COM6");
                                ((CButton*)GetDlgItem(IDC_COM6))->SetCheck(1);
                                break;
                case 7:        SetupCommPort("COM7");
                                ((CButton*)GetDlgItem(IDC_COM7))->SetCheck(1);
                                break;
                case 8:        SetupCommPort("COM8");
                                ((CButton*)GetDlgItem(IDC_COM8))->SetCheck(1);
                                break;
                default: ((CButton*)GetDlgItem(IDC_COM1))->SetCheck(0);
        }
        SetTimer(1, 600, 0);

        return TRUE;  // return TRUE  unless you set the focus to a control
}

void CUSB_I2C_SRF08Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
                CAboutDlg dlgAbout;
                dlgAbout.DoModal();
        }
        else
        {
                CDialog::OnSysCommand(nID, lParam);
        }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CUSB_I2C_SRF08Dlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this); // device context for painting

                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                // Center icon in client rectangle
                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;

                // Draw the icon
                dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
                CDialog::OnPaint();
        }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CUSB_I2C_SRF08Dlg::OnQueryDragIcon()
{
        return (HCURSOR) m_hIcon;
}

void CUSB_I2C_SRF08Dlg::SetupCommPort( LPCTSTR comport)
{
        DCB dcb;
        COMMTIMEOUTS ct;

        CloseHandle(hCom);
        hCom = CreateFile( comport, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
        GetCommState(hCom, &dcb);
        dcb.BaudRate = CBR_19200;
        dcb.fParity = FALSE;
        dcb.fOutxCtsFlow = FALSE;
        dcb.fOutxDsrFlow = FALSE;
        dcb.fDtrControl = DTR_CONTROL_DISABLE;
        dcb.fDsrSensitivity = FALSE;
        dcb.fOutX = FALSE;
        dcb.fInX = FALSE;
        dcb.fRtsControl = RTS_CONTROL_DISABLE;
        dcb.fAbortOnError = FALSE;
        dcb.ByteSize = 8;
        dcb.Parity = NOPARITY;
        dcb.StopBits = TWOSTOPBITS;
        SetCommState(hCom, &dcb);
  
        GetCommTimeouts(hCom, &ct);
        ct.ReadIntervalTimeout = 500;
    ct.ReadTotalTimeoutMultiplier =500;
    ct.ReadTotalTimeoutConstant = 500;
        SetCommTimeouts(hCom, &ct);

        SetCommMask(hCom, EV_RXCHAR);
}

void CUSB_I2C_SRF08Dlg::OnCom1()
{
        CommPort = 1;       
        SetupCommPort("COM1");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom2()
{
        CommPort = 2;       
        SetupCommPort("COM2");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom3()
{
        CommPort = 3;       
        SetupCommPort("COM3");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom4()
{
        CommPort = 4;       
        SetupCommPort("COM4");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom5()
{
        CommPort = 5;       
        SetupCommPort("COM5");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom6()
{
        CommPort = 6;       
        SetupCommPort("COM6");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom7()
{
        CommPort = 7;       
        SetupCommPort("COM7");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}

void CUSB_I2C_SRF08Dlg::OnCom8()
{
        CommPort = 8;       
        SetupCommPort("COM8");
           CWinApp* App = AfxGetApp( );
           App->WriteProfileInt("SETTINGS","COMPORT",CommPort);
}
作者: robot2009    時間: 2010-2-9 14:46
續上面的CODE
-------------------------------------
void CUSB_I2C_SRF08Dlg::OnTimer(UINT nIDEvent)
{
static int x=0;
CString s;
DWORD n;
static int search_addr=0xe0;
char cmd[10];
static int idx=1, dir=0, scan=0, old_idx=1, cm02_ver;
BYTE sbuf[100];

        if(CommPort==0) {
                SetDlgItemText( IDC_MSG, "Set Com Port" );
        }       
        else if(cm02_ver==0) {
                sbuf[0] = CM01_CMD;                        // send read battery command
                sbuf[1] = VERSION;
                sbuf[2] = 0x00;
                sbuf[3] = 0x00;
            WriteFile(hCom, &sbuf, 4, &n, NULL);
                ReadFile(hCom, &sbuf, 1, &n, NULL);
                cm02_ver = sbuf[0];
                s.Format("%i", sbuf[0]);
                SetDlgItemText( IDC_USB_I2C_VER, s );
        }
        else if(Addr==0) {                        // find srf08
                sbuf[0] = I2C_CMD;                        // send sonar read command
                sbuf[1] = search_addr+1;
                sbuf[2] = 0x00;
                sbuf[3] = 0x01;
            WriteFile(hCom, &sbuf, 4, &n, NULL);
                ReadFile(hCom, &sbuf, 1, &n, NULL);
                if(sbuf[0]<20) {
                        Addr = search_addr;
                        s.Format("0x%02X ", Addr);
                        SetDlgItemText( IDC_SRF08_ADDR, s );
                        SetDlgItemText( IDC_MSG, "SRF Found" );
//                        ((CButton*)GetDlgItem(IDC_UPDATE))->EnableWindow(FALSE);
                }
                else {
                        search_addr += 2;
                        if(search_addr>0xfe) search_addr = 0xe0;
                        s.Format("0x%02X", search_addr);
                        SetDlgItemText( IDC_SRF08_ADDR, s );
                        SetDlgItemText( IDC_MSG, "Searching" );
                }
                Invalidate(TRUE);
        }
        else {
                sbuf[0] = I2C_CMD;                        // send sonar read command
                sbuf[1] = Addr+1;
                sbuf[2] = 0x00;
                sbuf[3] = 0x04;
            WriteFile(hCom, &sbuf, 4, &n, NULL);

                ReadFile(hCom, &sbuf, 4, &n, NULL);
                s.Format("%i", sbuf[0]);
                SetDlgItemText( IDC_SRF08_VER, s );
                if(sbuf[0]>20) Addr=0;

                s.Format("%i ", sbuf[1]);
                SetDlgItemText( IDC_SRF08_LIGHT, s );

                n = sbuf[2]<<8;
                n |= sbuf[3];
                s.Format("%i", n);
                SetDlgItemText( IDC_SRF08_US, s );
                s.Format("%i", n/58);
                SetDlgItemText( IDC_SRF08_CM, s );
                s.Format("%i", n/148);
                SetDlgItemText( IDC_SRF08_INCH, s );

                sbuf[0] = I2C_CMD;                        // send gain limit
                sbuf[1] = Addr;
                sbuf[2] = 0x01;
                sbuf[3] = 0x01;
                sbuf[4] = 20;
            WriteFile(hCom, &sbuf, 5, &n, NULL);
                ReadFile(hCom, &sbuf, 1, &n, NULL);

                sbuf[0] = I2C_CMD;                        // send sonar rangeing (uS) command
                sbuf[1] = Addr;
                sbuf[2] = 0x00;
                sbuf[3] = 0x01;
                sbuf[4] = 0x52;
            WriteFile(hCom, &sbuf, 5, &n, NULL);
                ReadFile(hCom, &sbuf, 1, &n, NULL);

/*                sbuf[0] = I2CD_CMD;                        // send direct to chip write command
                sbuf[1] = 0x40;
                if((x&3)==3) sbuf[2] = 0xfe;
                else sbuf[2] = 0xff;
                x++;
            WriteFile(hCom, &sbuf, 3, &n, NULL);
                ReadFile(hCom, &sbuf, 1, &n, NULL);

                sbuf[0] = I2CD_CMD;                        // send direct to chip read command
                sbuf[1] = 0x41;
            WriteFile(hCom, &sbuf, 2, &n, NULL);
                ReadFile(hCom, &sbuf, 1, &n, NULL);

                s.Format("0x%x ", sbuf[0]);
                SetDlgItemText( IDC_SRF08_LIGHT, s );
*/
        }
        CDialog::OnTimer(nIDEvent);
}
作者: forgive    時間: 2011-6-1 23:52
也可以選用SRF08/SRF10的替代品KS101B試下,
購買網址:http://item.taobao.com/item.htm?id=9975880560
公司資料下載:www.dauxi.com
作者: forgive    時間: 2011-6-2 00:11
發送完每個指令稍微延時下,
也可以選用SRF08的替代品KS101B,
購買網址:http://item.taobao.com/item.htm?id=9975880560
公司資料下載:www.dauxi.com

是否台灣也開始學共產黨,發信息還要審核?
作者: forgive    時間: 2011-6-2 00:57
一般加大延時都可解決
作者: forgive    時間: 2011-7-2 01:21
KS101B已經有台灣客戶在用了,使用arduino平台控制,贊一個。體積更小的KS103也是「千呼萬喚始出來」,大家可以通過說明書瞭解一下:中文版說明書及C代碼:www.dauxi.com/KS10X-V110_CN.pdf
英文版說明書及C代碼:www.dauxi.com/KS10X-V110_EN.pdf

為了方便大家的需要,放上樣品鏈接吧。。。。。。
http://item.taobao.com/item.htm?id=10417705318
作者: g921002    時間: 2011-7-2 01:40
台灣用tabao很難用,可以的話放露天或奇摩比較好。
作者: chensnowenglish    時間: 2011-7-6 16:13
我公司供應超越SRF08的KS101B超聲波感測器,她採用I2C介面的超聲波測距模組. 探測範圍1cm-650cm.並涵蓋高精溫度、光強度探測.

● 包含即時溫度補償的距離探測,高探測精度
● 採用專利技術的探測模式,探測範圍1cm~650cm
● 探測頻率可達500Hz,即每秒可探測500次
● 使用I2C介面與主機通信,自動回應主機的I2C控制指令
● 共20個可修改的I2C地址,範圍為0xd0 ~ 0xfe (0xf0,0xf2,0xf4,0xf6除外)
● 支持0x00廣播位址
● 83ms快速、高精度的溫度探測,隨時感知環境精確溫度
● 5s未收到I2C控制指令自動進入uA級休眠,並可隨時被主機I2C控制指令喚醒
● 短距探測量程由10cm、20cm、……、至470cm,滿足快速近距探測
● 1ms快速光強探測,即時探測即時光強
● 使用工業級配置,工作溫度 (-30℃~+85℃)
● 寬工作電壓範圍 (3.0V~5.5V)
● 採用獨特的可調濾波降噪技術,電源電壓受干擾或噪音較大時,仍可正常工作
資料資料下載:
中文版說明書及C代碼
英文版說明書及C代碼
http://www.dauxi.com/




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2