電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>城市指南設(shè)備構(gòu)建

城市指南設(shè)備構(gòu)建

2023-07-11 | zip | 0.37 MB | 次下載 | 免費(fèi)

資料介紹

功能性

該設(shè)備易于客戶使用,也易于旅游公司設(shè)置,只需幾分鐘,設(shè)備即可啟動(dòng)并準(zhǔn)備運(yùn)行。在下雨或晴天時(shí),CityGuide 將引導(dǎo)任何人穿過(guò)城市。

該設(shè)備操作非常簡(jiǎn)單;使用 Sony Spresense 的機(jī)載 GNSS 模塊,它可以檢索個(gè)人的當(dāng)前位置并對(duì)其進(jìn)行處理,以查看他們是否位于地圖上的某個(gè)地標(biāo)處。如果用戶在標(biāo)記的位置;將播放地標(biāo)的適當(dāng)錄音,簡(jiǎn)要告??知客戶他們所看到的背景。下圖顯示了功能概述。

?
poYBAGOuNm2ALRrIAABtKVLJG8c564.png
功能概述
?

設(shè)置概述

供應(yīng)商,在我們的例子中是旅游公司,必須在使用設(shè)備之前設(shè)置設(shè)備(在構(gòu)建項(xiàng)目部分中找到設(shè)置項(xiàng)目的分步指南)。他們必須規(guī)劃用戶可以訪問(wèn)的地標(biāo)地圖,并記錄用戶到達(dá)所選地標(biāo)時(shí)將播放的曲目。所有這些數(shù)據(jù)都必須放在 SD 卡上,然后輸入到設(shè)備中。

設(shè)備啟動(dòng)

該設(shè)備需要在 SD 卡中輸入啟動(dòng)時(shí)所需的所有數(shù)據(jù)。在這里,設(shè)備將讀取給定的數(shù)據(jù),提取每個(gè)地標(biāo)的位置,以及用戶在給定位置時(shí)要播放的名稱和 mp3 文件,并將數(shù)據(jù)保存到變量中。

然后設(shè)備將在所有提供的位置周?chē)鷦?chuàng)建一個(gè)網(wǎng)格,該網(wǎng)格將用于將用戶的當(dāng)前地理位置與地標(biāo)的位置進(jìn)行比較,以便查看用戶是否位于地標(biāo)處。

播放文件

如果設(shè)備可以確認(rèn)用戶在地標(biāo)處,它會(huì)播放該地標(biāo)的文件并將音頻輸出到耳機(jī)插孔。如果兩個(gè)網(wǎng)格共享相同的位置,設(shè)備將播放它遇到的第一個(gè)地標(biāo)的文件。

代碼概述

下圖說(shuō)明了項(xiàng)目的代碼概述。

?
poYBAGOuNnCAdsTPAABiZOgvtzw470.png
代碼概述
?
  • Get File Data從設(shè)備管理器提供的 SD 文件中檢索數(shù)據(jù)并進(jìn)行處理。
  • Get GPS從 GNSS 模塊讀取當(dāng)前地理位置。
  • If(GPS)檢查是否已從連接的衛(wèi)星接收到新的 GPS 數(shù)據(jù),以及衛(wèi)星是否已修復(fù)。
  • Compare with Locations將接收到的地理位置與用戶輸入的地標(biāo)的地理位置進(jìn)行比較。
  • If(atLandmark)如果當(dāng)前地理位置位于圍繞輸入的地理位置生成的網(wǎng)格內(nèi),則觸發(fā)。
  • Play Audio為客戶端所在的地標(biāo)播放適當(dāng)?shù)囊纛l文件。

調(diào)試 LED

Spresense 板配備了 4 個(gè)調(diào)試 LED,其中 3 個(gè)被該應(yīng)用程序用于調(diào)試目的。

?
?
?
?
poYBAGOuNnWAIMSqAAqbDlrLmro389.jpg
?
1 / 2 ?調(diào)試 LED
?
  • LED 1是上圖頂部的第一個(gè) LED。它用于指示設(shè)備的當(dāng)前狀態(tài)。它在設(shè)備設(shè)置時(shí)閃爍,然后在算法運(yùn)行時(shí)保持亮起。
  • LED 2為 GNSS 狀態(tài) LED,用于指示當(dāng)前 GNSS 狀態(tài)。當(dāng)設(shè)備正在搜索衛(wèi)星且尚未接收 GPS 數(shù)據(jù)時(shí),LED 會(huì)閃爍;當(dāng)設(shè)備鎖定到衛(wèi)星并正在接收可靠的地理定位數(shù)據(jù)時(shí),LED 會(huì)保持亮起;如果設(shè)備未使用 GNSS,則 LED 會(huì)熄滅。
  • LED 3指示當(dāng)前是否正在播放 mp3 文件。它會(huì)在播放設(shè)置時(shí)閃爍,并在播放文件時(shí)保持亮起,在沒(méi)有播放時(shí)熄滅。

播放概述

當(dāng)音頻文件正在運(yùn)行時(shí),設(shè)備必須停止 GNSS 模塊,因?yàn)?GNSS 和音頻庫(kù)不能一起運(yùn)行,在所有衛(wèi)星連接的情況下播放完文件后,GNSS 將恢復(fù)。

用戶可以使用提供的電位器來(lái)切換設(shè)備的音量。

?
pYYBAGOuNnqAdJYMAAdqR6xjiZE472.jpg
電位器
?

但是也可以瀏覽這些圖像,因?yàn)樗鼈兎浅:谩?/font>

?

該設(shè)備的設(shè)計(jì)方式使得一個(gè)位置只能訪問(wèn)一次。到達(dá)該位置后,將播放該文件并將該位置標(biāo)記為已看到,這可以防止該文件在客戶端第二次到達(dá)同一位置時(shí)播放。

?
?
?
?
poYBAGOuNn-AJhorAAlTgJgMOs0863.jpg
?
1 / 2 ?在 GPO 前(都柏林)
?

好處

改用 CityGuide 的公司將受益于:

  • 更大的自主權(quán)和易于設(shè)置
  • 降低成本
  • 快速部署
  • 吸引客戶的專(zhuān)業(yè)方式

使用 CityGuide 的個(gè)人將受益于:

  • 更快速地游覽這座城市
  • 以他們的速度觀光
  • 選擇要參觀的地標(biāo)
  • 集體或單獨(dú)參觀

構(gòu)建項(xiàng)目

1 步:所需設(shè)備

該項(xiàng)目不需要很多組件,因?yàn)榇蟛糠炙璧?a href='http://www.ttokpm.com/v/tag/117/' target='_blank' class='arckwlink_none'>傳感器和模塊都內(nèi)置在 Spresense 板中,材料清單如下。

  • 1、索尼Spresense板
  • 1、電位器
  • 1、面包板
  • 1、SD卡
  • 耳機(jī)/耳機(jī)
  • 跳線
?
poYBAGOuNoaAJzenAAyvYSjUSG4209.jpg
所有組件
?

第 2 步:連接電路

所要做的就是將電位計(jì)連接到 Spresense 板上,原理圖如下所示。

?
pYYBAGOuNomAVUtWAAJMz0-az9M909.png
原理圖
?

焊接電位器

由于用戶不會(huì)隨身攜帶面包板,因此必須將電位器焊接到 Spresense 板上。下面是一些焊接圖片。

?
?
?
?
poYBAGOuNo6AVWVIAArZO-lxuNM564.jpg
?
1 / 2 ?獲取電位器
?

第 3 步:安裝 Arduino Spresense 庫(kù)

首先,我們需要包含使用 Arduino IDE 操作 Spresense 板所需的庫(kù)。使用板管理器可以輕松完成此操作。按照以下步驟指導(dǎo)您完成設(shè)置環(huán)境的步驟。

?
?
?
?
poYBAGOuNpKAa5w2AAOcRLoTbQk672.png
?
1 / 9 ?第一步是在您的計(jì)算機(jī)上打開(kāi) Arduino IDE
?

第 4 步:安裝端口實(shí)用程序

下面的指南將顯示下載和安裝所需的端口實(shí)用程序所需的步驟,以便從您的 Spresense 或向您的 Spresense 發(fā)送命令,反之亦然。本指南專(zhuān)為 Mac 用戶設(shè)計(jì),使用此鏈接可幫助您在 PC 上安裝 Port Utility。

首先,為您的操作系統(tǒng)下載合適的實(shí)用程序。

?
?
?
?
pYYBAGOuNpeAfIm0AARe-SV1z-I345.png
?
1 / 5 ?現(xiàn)在,打開(kāi)下載,單擊 .dmg 文件
?
請(qǐng)注意,Arduino 板無(wú)法在安裝實(shí)用程序的情況下運(yùn)行,卸載它以在您的計(jì)算機(jī)上編程和使用 Arduino 或類(lèi)似的板是至關(guān)重要的。
為了卸載VPC驅(qū)動(dòng)程序。在 .dmg 文件中找到uninstaller.sh shell 腳本,然后使用Mac 上的終端運(yùn)行它。這樣做;打開(kāi)Terminal ,然后鍵入uninstaller.sh文件并將其ssh 拖放到 Terminal 窗口中。可能會(huì)要求您輸入密碼。

第 5 步:更新 Spresense 的固件

為了在您的 Spresense 開(kāi)發(fā)板上運(yùn)行項(xiàng)目;它需要更新到最新的固件。下面的指南說(shuō)明了更新設(shè)備固件所需的步驟。

?
?
?
?
poYBAGOuNp2AT3nkAAxNVfyB7Kg616.jpg
?
1 / 7 ?第一步是準(zhǔn)備好 Spresense 板
?

第 6 步:安裝 MP3 解碼器

為了在 Spresense 板上播放 MP3 文件,設(shè)備上需要一個(gè) MP3 解碼器。該解碼器可以安裝在設(shè)備的 SPI 閃存或 SD 卡上。我們將把它安裝在閃存上,這樣我們就不需要特定的 SD 卡來(lái)運(yùn)行該項(xiàng)目。下面的步驟說(shuō)明了安裝解碼器的步驟。

?
?
?
?
poYBAGOuNqGAYijdAAQ-ExM-ox8823.png
?
1 / 7 ?下載并打開(kāi)下面代碼部分提供的 MP3DecoderInstaller Arduino 草圖
?

第 7 步:設(shè)置 SD 卡

為了在您的項(xiàng)目中使用 SD 卡,必須將其適當(dāng)格式化為 FAT。下面的步驟顯示了如何在 Mac 上完成此操作。

?
?
?
?
poYBAGOuNqaAApQRAAzTIg7nQTM859.jpg
?
1 / 8 ?獲取您將使用的 SD 卡
?

第 8 步:準(zhǔn)備文件

現(xiàn)在我們必須在 SD 卡上設(shè)置文件,這些文件將用于識(shí)別設(shè)備的地標(biāo)并為其提供聲音文件以在特定地標(biāo)處播放。SD 卡上需要以下文件。

  • Datalog.txt是管理員輸入地標(biāo)和相關(guān)數(shù)據(jù)的文本文件
  • mp3文件用作設(shè)備到達(dá)適當(dāng)?shù)貥?biāo)時(shí)將播放的文件。

datalog.txt文件是設(shè)備的核心,項(xiàng)目運(yùn)行所需的所有數(shù)據(jù)都包含在該文件中。經(jīng)理可以在地圖上添加任意數(shù)量的地標(biāo),他們所要做的就是在文件中為該地標(biāo)添加一行。下圖說(shuō)明了必須格式化專(zhuān)用于地標(biāo)的線的方式。

?
pYYBAGOuNqmARlYVAAEMKZ3rT4U962.png
數(shù)據(jù)記錄格式化概述
?
  • GPO是線上表示的地標(biāo)的名稱。它可以是任何東西,但不能包含空格。
  • 53.349430,-6.260235是地標(biāo)的地理位置,獲取這個(gè)位置在下面的指南中有描述。緯度和經(jīng)度由分號(hào)分隔,沒(méi)有空格。
  • fileA.mp3是當(dāng)用戶位于特定位置時(shí)播放的文件,在我們的例子中是 GPO。請(qǐng)注意,名稱中不允許有空格,.mp3必須包含在末尾并且名稱不能包含數(shù)字。
  • 每個(gè)部分之間包含一個(gè)空格。

記住上圖,我們可以開(kāi)始自定義datalog.txt文件。下面的圖片將指導(dǎo)您完成整個(gè)過(guò)程。

?
?
?
?
poYBAGOuNqyAKHaSAADiVphmcZk132.png
?
1 / 20 ?打開(kāi)谷歌地圖
?

第 9 步:確認(rèn)代碼

代碼有 3 個(gè)主要部分,每個(gè)部分都很大。

  • 獲取標(biāo)清設(shè)置
  • 獲取和處理 GPS
  • 播放音頻文件

它們都在下面詳細(xì)介紹。

獲取標(biāo)清設(shè)置

void getData()
{
 Serial.println("Getting Data");
 Serial.println("________________________________________");
 Serial.println("Locating File");
 Serial.println("  OK - Preparing Variables");
 int space = 0;
 int comma = 0;
 String localName[10];
 String localSound[10];
 String localRawLocation[10];
 String localLatitude[10];
 String localLongitude[10];
 Serial.println("  OK - Opening File 'datalog.txt'");
 myFile = SD.open("datalog.txt");
 Serial.println("  OK - Verifying Presence");
 if(myFile)
 {
   Serial.println("  Success - File Loaded");
   Serial.println("");
   Serial.println("Extracting Data");
   Serial.println("  OK - Beginning Final Extraction");
   while(myFile.available())
   {
     char c = myFile.read();
     if(c == '\n')
     {
       newLine++;
     }
     else if(c == ' ')
     {
       space++;
     }
     else
     {
       if(space == 0)
       {
         localName[newLine] += c;
       }
       else if(space == 1)
       {
         if(c == ',')
         {
           comma++;
         }
         else if(comma == 0)
         {
           localLatitude[newLine] += c;
         }
         else
         {
           localLongitude[newLine] += c;
         }
         localRawLocation[newLine] += c;
       }
       else if(space == 2)
       {
         localSound[newLine] += c;
         if(c == '3')
         {
           space = 0;
           comma = 0;
         }
       }
     }
   }
   // parse the local data into the struct
   for(int i = 0; i < (newLine + 1); i++)
   {
     landmark[i].name = localName[i];
     landmark[i].sound = localSound[i];
     landmark[i].rawLocation = localRawLocation[i];
     landmark[i].latitude = localLatitude[i].toFloat();
     landmark[i].longitude = localLongitude[i].toFloat();
   }
 }
 else
 {
   Serial.println("  Error - File not Present");
   Serial.println("  OK - Terminating Algorithm");
   Serial.println("________________________________________");
   Serial.println("");
   terminateLEDS();
   while(1) {};
 }
 myFile.close();
 Serial.println("  Success - Data Loaded Locally");
 Serial.println("");
 feedback();
 drawGrid();
}
  
void feedback()
{
 Serial.println("Data Feedback");
 Serial.println("  OK - Dumping All Data");
 Serial.println("");
 for(int i = 0; i < (newLine + 1); i++)
 {
   Serial.print("Struct "); Serial.println(i);
   Serial.print("  location name   "); Serial.println(landmark[i].name);
   Serial.print("  sound file      "); Serial.println(landmark[i].sound);
   Serial.print("  raw location    "); Serial.println(landmark[i].rawLocation);
   Serial.print("  latitude        "); Serial.println(landmark[i].latitude, 4);
   Serial.print("  longitude       "); Serial.println(landmark[i].longitude, 4);
 }
 Serial.println("");
 Serial.println("  Success - Data Dumped");
 Serial.println("________________________________________");
 Serial.println("");
}
  
void drawGrid()
{
 Serial.println("Generating Grids");
 Serial.println("________________________________________");
 Serial.println("Mapping Grid Around Co-ordinates");
 Serial.println("  OK - Looping through landmarks");
 for(int i = 0; i < (newLine + 1); i++)
 {
   landmark[i].maxLat = landmark[i].latitude + 0.001;
   landmark[i].minLat = landmark[i].latitude - 0.001;
   landmark[i].maxLng = landmark[i].longitude + 0.001;
   landmark[i].minLng = landmark[i].longitude - 0.001;
 }
 Serial.println("  Success - Grids Generated");
 Serial.println("");
 Serial.println("Dumping Grid Data");
 Serial.println("  OK - Dumping Grid Data");
 Serial.println("");
 for(int i = 0; i < (newLine + 1); i++)
 {
   Serial.print("Struct "); Serial.println(i);
   Serial.print("  max lat   "); Serial.println(landmark[i].maxLat, 4);
   Serial.print("  min lat   "); Serial.println(landmark[i].minLat, 4);
   Serial.print("  max lng   "); Serial.println(landmark[i].maxLng, 4);
   Serial.print("  min lng   "); Serial.println(landmark[i].minLng, 4);
 }
 Serial.println("");
 Serial.println("  Success - Data Dump Complete");
 Serial.println("________________________________________");
 Serial.println("");
}

這部分代碼由3個(gè)循環(huán)組成。總的來(lái)說(shuō),這部分從datalog.txt中讀取數(shù)據(jù)并進(jìn)行處理。

  • getData()讀取文件并從中提取數(shù)據(jù),計(jì)算輸入的位置數(shù)以及所有這些位置的詳細(xì)信息。
  • feedback()將接收到的數(shù)據(jù)打印到串行監(jiān)視器以允許用戶調(diào)試數(shù)據(jù)文件
  • drawGrid()在所有輸入的地理位置周?chē)L制一個(gè)網(wǎng)格,如果客戶端位于這些網(wǎng)格之一內(nèi),則設(shè)備會(huì)播放適當(dāng)?shù)穆曇粑募?/font>

獲取和處理 GPS

void startGPS(bool hot)
{
 Serial.println("");
 digitalWrite(LED0, HIGH);
 Serial.println("Initialising GNSS");
 Serial.println("  OK - Setting Debug");
 gnss.setDebugMode(PrintInfo); // set the mode to print info
 Serial.println("Initialising Module");
 if(gnss.begin() != 0)
 {
   Serial.println("  Error - Module Failed to Initialise");
   digitalWrite(LED0, LOW);
   while(1) {};
 }
 else
 {
   Serial.println("  OK - Setting Elements");
   gnss.select(QZ_L1CA);
   gnss.select(QZ_L1S);
   Serial.println("  OK - Starting Positioning");
   if(hot)
   {
     if(gnss.start(HOT_START) != 0)
     {
       Serial.println("  Error - Start Failed");
       digitalWrite(LED0, LOW);
       while(1) {};
     }
     else
     {
       Serial.println("  Success - GNSS Setup Complete");
     }
   }
   else
   {
     if(gnss.start(COLD_START) != 0)
     {
       Serial.println("  Error - Start Failed");
       digitalWrite(LED0, LOW);
       while(1) {};
     }
     else
     {
       Serial.println("  Success - GNSS Setup Complete");
     }
   }
 }
 digitalWrite(LED0, HIGH);
 delay(500);
}
  
void processGPS(SpNavData *pNavData)
{
 char dataBuffer[STRING_BUFFER_SIZE];
 // print number of satellites
 snprintf(dataBuffer, STRING_BUFFER_SIZE, "numSat:%2d, ", pNavData->numSatellites);
 Serial.print(dataBuffer);
 // print the location data
 Serial.print(" ");
 if(pNavData->posFixMode == FixInvalid)
 {
   Serial.print("NO FIX  ");
 }
 else
 {
   Serial.print("FIX     ");
 }
 if(pNavData->posDataExist == 0)
 {
   Serial.println("No Geolocation");
 }
 else
 {
   gpsLatitude = pNavData->latitude;
   gpsLongitude = pNavData->longitude;
   Serial.print(gpsLatitude, 6); Serial.print(","); Serial.println(gpsLongitude, 6);
   checkLocation();
 }
}
  
void checkLocation()
{
 for(int i = 0; i < (newLine + 1); i++)
 {
   if(gpsLatitude <= landmark[i].maxLat && gpsLatitude >= landmark[i].minLat &&
      gpsLongitude <= landmark[i].maxLng && gpsLongitude >= landmark[i].minLng )
   {
     if(landmark[i].visited)
     {
       Serial.println("  [1/2] Already Visited");
       delay(500);
     }
     else
     {
       Serial.println("  [1/2] First Visit");
       delay(1000);
       Serial.println("  OK - Checking Data");
       Serial.print("  landmark name       "); Serial.println(landmark[i].name);
       Serial.print("  landmark sound file "); Serial.println(landmark[i].sound);
       Serial.println("  [2/2] Calling 'playFile' with audio file");
       Serial.println("  OK - Calling Function");
       Serial.println("");
       attachFile(landmark[i].sound);
       landmark[i].visited = true;
       break;
     }
   }
 }
}

這一段也是由3個(gè)循環(huán)組成。它負(fù)責(zé)設(shè)置和啟用 GNSS 模塊以及連接和檢索來(lái)自衛(wèi)星的數(shù)據(jù)。

  • startGPS()初始化 GNSS 模塊,這不是在setup()循環(huán)中完成的,因?yàn)?GNSS 模塊在播放音頻之前被禁用并且必須再次啟用。
  • processGPS()void()循環(huán)中進(jìn)行讀取后處理 GNSS 模塊返回的數(shù)據(jù)并提取地理位置。
  • checkLocation()根據(jù)先前生成的網(wǎng)格檢查 GNSS 模塊接收到的地理位置,以檢查客戶端是否位于地標(biāo)處。

播放音頻文件

void attachFile(String fileName)
{
 Serial.println("");
 Serial.println("Setting Up File");
 Serial.println("________________________________________");
 Serial.println("Finalising Setup");
 digitalWrite(LED2, HIGH);
 delay(500);
 digitalWrite(LED2, LOW);
 Serial.println("");
 Serial.println("Locating File");
 Serial.println("  OK - Opening File");
 Serial.print("  OK - Locating "); Serial.println(fileName);
 soundFile = SD.open(fileName);
 if(!soundFile)
 {
   Serial.println("  Fatal Error - File Not Present");
   Serial.println("________________________________________");
   Serial.println("");
   delay(500);
   return;
 }
 else
 {
   Serial.println("  Success - File Located");
 }
 Serial.println("");
 Serial.println("Analysing Format");
 Serial.println("  OK - Getting Frames to Analyse");
 int err = theAudio->writeFrames(AudioClass::Player0, soundFile);
 Serial.println("  OK - Analysing Data");
 if(err != AUDIOLIB_ECODE_OK)
 {
   Serial.println("  Fatal Error - File Formatation is Bad");
   soundFile.close();
   Serial.println("________________________________________");
 }
 else
 {
   Serial.println("  Success - Formatation is Good");
 }
 Serial.println("________________________________________");
 Serial.println("");
 playFile(fileName);
}
void playFile(String fileName)
{
 Serial.println("Playing File");
 Serial.println("________________________________________");
 Serial.println("  OK - Pausing GNSS");
 gnss.stop();
 Serial.print("Playing "); Serial.println(fileName);
 theAudio->startPlayer(AudioClass::Player0);
 digitalWrite(LED2, HIGH);
 while(1) // main playback loop
 {
   Serial.print(".");
   int rawPot = analogRead(A0);
   int volume = map(rawPot, 0, 1024, -700, 0);
   theAudio->setVolume(volume); // set the volume to the position of the potentiometer
   int err = theAudio->writeFrames(AudioClass::Player0, soundFile);
   if(err == AUDIOLIB_ECODE_FILEEND) // end of file record
   {
     Serial.println("");
     break;
   }
   if(err)
   {
     Serial.println("");
     Serial.println("  Error - Playback Error");
     Serial.print("  OK - Error ID "); Serial.println(err);
     break;
   }
   usleep(40000);
 }
 theAudio->stopPlayer(AudioClass::Player0);
 soundFile.close();
 digitalWrite(LED2, LOW);
 Serial.println("  OK - Playback Terminated");
 delay(500);
 Serial.println("  OK - Restarting GNSS");
 startGPS(true);
 Serial.println("________________________________________");
 Serial.println("");
 delay(500);
}

這部分代碼控制mp3文件的播放,設(shè)置文件然后播放。

  • attachFile()設(shè)置播放,它開(kāi)始播放程序,檢查文件是否存在并驗(yàn)證以確保 mp3 文件格式正確且?guī)勺x。
  • playFile()通過(guò)禁用 GNSS 模塊開(kāi)始播放,完成設(shè)置,然后實(shí)際播放文件,直到完成,用戶可以在文件播放時(shí)使用電位器控制播放音量。

設(shè)置變量

現(xiàn)在已經(jīng)描述了代碼,一些變量必須個(gè)性化,以便從項(xiàng)目中獲得最佳體驗(yàn)。要編輯的第一個(gè)變量是proDebug,此變量控制串行打印。如果啟用(設(shè)置為true),則設(shè)備需要連接到計(jì)算機(jī)并啟用串行監(jiān)視器。默認(rèn)設(shè)置為false,因?yàn)楸仨殞⑵湓O(shè)置為false才能在字段上操作。

第二個(gè)變量不需要實(shí)際編輯,但必須調(diào)整索引名為的結(jié)構(gòu)Landmark用于保存所有與地標(biāo)相關(guān)的數(shù)據(jù),下面包含具有該結(jié)構(gòu)的代碼片段。

struct Landmark
{
 // strings
 String name;
 String sound;
 String rawLocation;
 // actual location
 float latitude;
 float longitude;
 // grid co-ordinates
 float maxLat;
 float minLat;
 float maxLng;
 float minLng;
 // extras
 bool visited;
};
  
Landmark landmark[10];

如上所示,包括從名稱到是否已經(jīng)訪問(wèn)過(guò)該位置的所有內(nèi)容。必須更改的是下面的聲明,它創(chuàng)建了一個(gè)結(jié)構(gòu)實(shí)例數(shù)組。目前,我有 10 個(gè)地標(biāo)的索引,經(jīng)理必須將此數(shù)字更改為他們已包含在文件中的地標(biāo)數(shù)量。如果少于 10 個(gè),則可以保留原樣。就是這樣。

圖書(shū)館

  • SDHCI - Copyright (c)2018 Sony Semiconductor Solutions Corporation根據(jù)GNU Lesser General PublicLicense這個(gè)庫(kù)在公共領(lǐng)域
  • GNSS - Copyright (c)2018 Sony Semiconductor Solutions Corporation根據(jù)GNU Lesser General PublicLicense這個(gè)圖書(shū)館在公共領(lǐng)域
  • 音頻- Copyright (c)2018 Sony Semiconductor Solutions Corporation根據(jù)GNU Lesser General PublicLicense這個(gè)圖書(shū)館在公共領(lǐng)域

最后

最后一步是將設(shè)備插入計(jì)算機(jī)并上傳草圖。功耗方面,我已經(jīng)將 Spresense 板連接到移動(dòng)電源,它應(yīng)該可以使用幾次,然后才需要充電。

然后最后一步是封裝項(xiàng)目以使其可移植且美觀。我為該項(xiàng)目的外殼設(shè)計(jì)了一些快速示意圖,附在下面。

?
poYBAGOuNq-AU9uvAABVcmAQBDg188.png
外殼示意圖
?

我制作了外殼并完成得很好。我最終得到了一個(gè)看起來(lái)像這樣的盒子。

?
?
?
?
pYYBAGOuNrSAcD3sAAeBVTKBfw8967.jpg
?
1 / 4 ?頂部
?

所以在我完成原始盒子之后,是時(shí)候?qū)ζ溥M(jìn)行編輯并為電位器鉆一些孔并訪問(wèn)板載 SD 卡模塊和板載耳機(jī)插孔。下面的步驟顯示了如何完成外殼并將設(shè)備安裝到其中。

?
?
?
?
poYBAGOuNrqADNu0AAjfg6g_z7k320.jpg
?
1 / 12 ?首先,必須在可拆卸的前蓋上做一個(gè)方形切口和一個(gè)孔
?

所以現(xiàn)在,您已準(zhǔn)備好在現(xiàn)場(chǎng)使用該設(shè)備。請(qǐng)注意,在冷啟動(dòng)時(shí),設(shè)備需要大約 10 分鐘才能鎖定足夠多的衛(wèi)星來(lái)收集地理定位數(shù)據(jù)。就是這樣!

背景

我花了一段時(shí)間思考使用 Spresense 開(kāi)發(fā)板的偉大項(xiàng)目。問(wèn)題是你可以用 Spresense 板做任何東西,所以很難想出完美的想法。但我認(rèn)為我實(shí)現(xiàn)了一個(gè)偉大項(xiàng)目的想法。旅游方式的徹底改變。建立在你進(jìn)入博物館的設(shè)備上,當(dāng)你插入你正在看的東西的 ID 時(shí),那個(gè)帶耳機(jī)的設(shè)備會(huì)告訴你你正在看的東西。

它剝離了這個(gè)想法,用一個(gè)自動(dòng)系統(tǒng)代替手動(dòng)按鈕選擇,當(dāng)客戶到達(dá)一個(gè)位置時(shí)播放。按照您的節(jié)奏創(chuàng)造未來(lái)的觀光。

?
?
?
?
?
?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)