hira のすべての投稿

USBシリアル、どれがいい?

RXマイコンのフラッシュ書き込みでは、自分は、シリアルインターフェースによる書き込みが基本だ。

E1も持ってはいるが、OS-XやLinuxでは使えないし、14ピンのコネクタを繋ぐのも億劫だ。
それに、エミュレーターをほとんど使わないので、フラッシュの書き込みにしか用途が無い。
そうなるとUSBシリアルを使って、シリアル通信で書き込む方が簡単だと思う。
※書き込みツールも独自に対応している。

最近まで、アマゾンで買える格安の中華USBシリアルとしてCP2102を押していたが、状況が変わってきている。
問題として、以下の事項がある。

  • 使っているデバイスは古いCP2102(現在はCP2102Nが主流、古いデバイスを使っているのが安い理由なのかもしれない)
  • 複数のCP2102を一旦接続するとCOMポートの移り変わり現象が発生してまともに使えなくなる。
  • 複数接続するには、専用ツールで、内部シリアルIDを変更して、固体識別をさせる必要があるようだ。
  • CP2102では、専用ツールが正常に機能しないし、ツールのインストールからしてハードルが高い。
  • 色々やったが、CP2102では内部シリアルIDを変更する事が出来なかった。(理由が不明)

そこでやっぱり正統派FTDIだと思い、FTDIでも格安なFT231XSを使おうと思ったが、これには別の問題がある事が判った。(以前に自作したもの)

通信速度が明らかに遅い!

RX66T にレイトレーシングのプログラム(バイナリーで47K程度)を書き込んだ場合の時間:
※230400ボー、8ビット、1ストップビット
FT231XS: 16.6 秒
CP2102:   6.6 秒
上記のように、同じボーレートで条件は同じなのに、3倍近く通信速度が違う。
FT231XSは安い廉価バージョンなので、高級バージョンのFT232RLの場合も確かめてみた。
FT232RL: 18.1 秒
驚きだ、FTDIのデバイスは値段に関係無く、シリコンラボ製に比べてかなりパフォーマンスが劣るようだ・・・
※以前にシリアル通信を使った機器を作った時に感じたが、詳しく評価しなかった。(そんな事が起こるとは思ってない)

上記書き込み時間は、イレース時間、書き込み時間、比較時間などが組み合わさったもので、送信、受信をかなり頻繁に行い、目安なのだが、単純な送受信ではないアプリケーションレベルでの利用なので、逆に、ベンチマークには適しているとも思う。

そこで、今度は、CP2102Nを評価してみたい(主にシリアルIDの変更)と思ったが、調べてみると、CP2102Nを使ったモジュールは少ないようで、入手出来ていない。
※CP2102Nを使った、メーカーの標準キットが1000円くらいなのだが、送料がかかるのが痛いとこだ(同時購入品が何かないと・・・)

現状は、そんな状態だ、進展があったらまた報告するが、どちらにしてもFTDIを使う理由は無いだろうな・・・

RXマイコンでシーン管理(タスク管理)テンプレート

多少複雑なアプリなどを実装する場合、動作の推移を行う管理機構が必要になる事が多い。
やり方は色々だが、組み込みシステム向けに、シンプルな機構を実装したので紹介する。
平行処理にする程でも無い場合など、少し大きい単位で処理を分けて、影響範囲を限定的にする事が出来る。
※この方法は既に色々なシステムで利用しているが、多少アレンジした点として、以下のトピックがある。

  • シーンオブジェクトによる推移管理。
  • 可変引数テンプレートの利用。
  • std::tuple テンプレートを使い、シーンオブジェクトを管理。
  • 記憶割り当てを使わない。

まず、一つの推移単位をシーンクラスとして、インターフェースクラスを継承させている。
インターフェースクラスは以下のようなものとなっている。
※C++ では「= 0; 」とする事で「純粋仮想関数」とする事が出来る。(薄い皮のような物)
※デストラクタを「仮想」として実装しておく必要がある。

struct scene {
    virtual ~scene() { }        ///< デストラクタ
    virtual void init() = 0;    ///< シーン開始前処理
    virtual void service() = 0; ///< シーン・サービス
    virtual void exit() = 0;    ///< シーン終了処理
};
  • シーンを開始する前に必ず「init()」を呼び出す。
  • シーン中は「service()」が呼ばれ続ける。
  • シーンが切り替わる時、シーンを終了するタイミングで「exit()」が呼び出される。

シーン作成時、上記「scene クラス」を継承させて実体を実装する。
以下は「title」クラス。

class title : public scene {

public:
    void init() override
    {
    }

    void service() override
    {
    }

    void exit() override
    {
    }
};

通常シーンは複数あり、シーン管理機構で管理される、アプリケーション側は、各シーンの中身を実装する。

シーン管理クラス(scene_director)では、個々のシーンの実体をstd::tuple で保持しており、切り替えの操作や手順を提供する。
scene_director は、可変引数テンプレートを使って、ユーザー定義のシーンクラスを複数受け取る。

 template<class... Args>
 class scene_director {

    typedef std::tuple<Args...> SCENES;
    SCENES  scenes_;

    scene*  cur_scene_;
    scene*  new_scene_;

public:
    scene_director() noexcept : scenes_(), cur_scene_(nullptr), new_scene_(nullptr)
    { }

    template <class T>
    void change() noexcept
    {
        auto& news = std::get<T>(scenes_);
        new_scene_ = &news;
    }

    void service() noexcept
    {
        if(new_scene_ != nullptr) {
            if(cur_scene_ != nullptr) cur_scene_->exit();
            new_scene_->init();
            cur_scene_ = new_scene_;
            new_scene_ = nullptr;
        }

        if(cur_scene_ != nullptr) {
            cur_scene_->service();
        }
    }
};

このテンプレートを使い、以下のように全体を定義する。

#include "scene_director.hpp"
#include "title.hpp"
#include "menu.hpp"
#include "setup.hpp"

typedef scene_director<title, menu, setup> SCENES;
SCENES   scenes_;

これで大体全てなのだが、大きな問題がある、通常シーンの切り替えは、scene_director の change メソッドを使うのだが、各シーンから、scene_director にアクセスするには、scene_director のインスタンスと定義、各シーンの型などが必要で、それにアクセスする手段を設けるのは難しい。
そこで、かなり冗長でシンプルでは無いが、各シーンに通し番号を振っておき、この番号で切り替える機構を設けて、この関数呼び出しを extern しておく事にした。
各シーンの切り替えは「整数」なので、定義がシンプルでどこからでも呼び出せる。
※ただ、シーンとIDを二重に管理しなければならず、かなり痛い・・・

void change(scene_id id)
{
    switch(id) {
    case scene_id::title:
        scenes_.change<title>();
        break;
    case scene_id::menu:
        scenes_.change<menu>();
        break;
    case scene_id::setup:
        scenes_.change<setup>();
        break;
    }
}

※他の注意点として、インスタンス化の順番を理解しておく必要がある。
scene_director がインスタンス化されるタイミングで、各シーンのコンストラクターが呼び出されるので、各シーン中で何かをインスタンス化している場合、それが関わるクラスは、事前にインスタンス化されておかなければならない。
システムが複雑になると、忘れがちなので注意する必要がある。

※ソースコードは、「RX/common/scene.hpp」にある。

RXマイコン別性能(レイトレースによる)その2

RX66Tを入手したので、レイトレースを実行してみた。

その中で、RX65N Envision kit のコードを標準的にして、他のデバイスも評価していたが、LCDへの転送は、ポートバスによるソフトウェアー書き込みになっている。
水平ライン毎に、レンダリング時間を描画しているが、ポート経由だと、フォント描画がボトルネックになっている事実などがあり、コーディングを整理した。

まず、各マイコン別のタイムを表にしたので参考にしてもらいたい。
※今回、RX64M も加えた。

型番 動作周波数 [MHz] ROM RAM 実時間 [ミリ秒] 価格 [円]
R5F524TAADFP RX24T 80 256K 16K 1224 974 (572/10)
R5F565NEDDFB RX65N 120 2M 640K 784 1910 (1320/10)
R5F564MFCDFC RX64M 120 2M 512K 751 2120 (1570/10)
R5F566TEBDFP RX66T 160 512K 64K 602 900(参考)
R5F571MFDDFC RX71M 240 2M 512K 439 2600 (1940/10)

RX66Tの価格は、RSコンポーネンツで1個購入時のもので、チップワンストップで扱うようになれば、多少異なると思う。

描画ハードに関して、RX64M、RX66Tは、実際にはLCDを接続していないが、RX64MはRX71M、RX66TはRX24Tと同一のインターフェースがあるものとしているので正確だと思う。
※ポート経由の描画オーバーヘッドは、RX66Tで118ミリ秒もある。(ただRAMに書くだけだと484ミリ秒)

通常、描画時間は、ライン毎に%表示されるが、ソフトによるポートバスでは、オーバーヘッドがかなり大きいので、その部分をコメントアウトして、描画後に1回だけ表示するようにしている。

RX66TのRXv3コアの評価は、この結果からはイマイチ判らないが、RX71MやRX64Mの値からすると、やはり少し効率が高いようだ、ただ、浮動小数点演算が多いので、イマイチ参考にならない。

現段階でも、CPはRX66Tがもっとも優れていると言える。

ソースコードなどは、Github のRX/RAYTRACER_sample に全てある。


EMLE 端子のプルダウンを入れてから、フラッシュの書き込みは一度も失敗しないようになった。

ルネサスRX66T(その1)

ルネサスRXマイコンを購入する場合、自分の場合「チップワンストップ」がほとんどで、他ではほぼ買わない(値段が一番安く、種類が豊富、個数割引もあるので)。

RX66Tは、発表されてからかなりたつものの、未だにチップ単体での販売はされていない。

ところが、ツイッターで「RX66TでLチカした」とゆーツイートを見つけた・・
※変換基板だったので、デバイス単体で入手したようだった。
ツイートした人はマイクロマウスをやってる人のようで、「どうやって入手したの?」と聞いたが連絡は取れず、色々調べたら「RSコンポーネンツ」で販売している事を見つけた。
1個900円と少し高いと思ったが、早く試してみたかったので、早速1個購入した。
※それにRXマイコンも10周年らしぃのでw
※現在(4月9日)、ルネサスのHPでも、RX66Tの販売先としてはどこも登録されていない。
※次の日には届いて、変換基板にハンダ付け。
※購入した型番は「R5F566TEBDFP」で、PGA 差動入力なし、USB なし、100 ピン、プログラムフラッシュ 512K、RAM 64K、データフラッシュ 32K

早速、変換基板に取り付け

写真のハンダ付けはちょっと汚いが、一応ブリッジや接触不良は無いものと思う。(よく確認した)
いつものように「直付」する為、裏側をカプトンテープで保護する。

ユニバーサル基板に直接乗せ、ガイドとして、適当なヘッダーピンを刺しておき、対角のピンにハンダを流して、変換基板と、下のユニバーサル基板を固定する。
後は、電源ライン、MD端子、クリスタル関係、リセットSW、シリアルラインなど、最低限必要な線だけ配線する。


  • (20) PD5/RXD1 <— TXD (USB Serial)
  • (22) PD3/TXD1 —> RXD (USB Serial)
  • (6) MD L:Boot、H:Run
  • (1) /RES
  • (5) VCL GND 間に 0.47uF
  • (11) XTAL 10MHz、GND間に 8pF
  • (13) EXTAL 10MHz、GND間に 8pF
  • (2) EMLE 4.7K で プルダウン(エミュレーターイネーブル)
  • (15) PE2/NMI 10K でプルアップ

rxprog も、RX66T 用にプロトコルを追加して、LED 点滅は直ぐに動作した。
RX66T関係のデバイス定義は、発表と同時くらいに、ハードウェアーマニュアルをダウンロードして、実装していたので、ソフトの準備はそれなりに出来ていた。
RX66T の内部構成は、RX24T よりRX64M 系に近い。
今回入手したデバイスは、USB は内臓していないバージョンだが、ラインナップには USB 付きもある、その場合、内臓クロックは12の倍数にする必要があり、144MHz 動作になってしまうと思う(最高速は160MHzなので少しもったいない)。

static void micro_second(uint32_t us)
{
    while(us > 0) {
#if defined(SIG_RX64M) || defined(SIG_RX63T) || defined(SIG_RX71M)
        for(uint32_t n = 0; n < (F_ICLK / 4285714); ++n) {
            asm("nop");
        }
#elif defined(SIG_RX65N)
        for(uint32_t n = 0; n < (F_ICLK / 4444444); ++n) {
            asm("nop");
        }
#elif defined(SIG_RX24T)
        for(uint32_t n = 0; n < (F_ICLK / 4444444); ++n) {
            asm("nop");
        }
#elif defined(SIG_RX66T)
        for(uint32_t n = 0; n < (F_ICLK / 3346666); ++n) {
            asm("nop");
        }
#else
#  error "delay.hpp requires tune dummy operations"
#endif
        --us;
    }
}

RX66T は、RXv3 コアとなっており、実測による簡単なソフトループだが、今までのRXコアより15~20%くらい速いようだ。
※同じバイナリーでこれだけ高速なのは、驚くべき性能だと思う。
※ちゃんとしたベンチマークは後ほど行う予定

現在の問題として、フラッシュプログラム中に停止する症状がある。
これは、原因を特定出来ていない・・・
とりあえず、rx_prog.conf のシリアル速度を、230400から115200に落としたら、多少安定して書き込めるようなので、当面そうしておく。
※RX64M、RX71M、RX24T では、問題無いのだが・・・

とりあえず
FIRST_sample/RX66T(LED 点滅)
SCI_sample/RX66T(シリアル通信)
は、動作する事を確認した。

※RX66T では、SCI のベースクロックは、PCLKBを利用するが、このクロックの最大は60MHzで、内臓クロックを160MHzで動かす場合、最大では40MHzとなる。


フラッシュ書き込み時にハングアップする原因が判ったと思う。
RX66Tでは、EMLE端子が増設された、「1」でエミュレーターイネーブルなので、とりあえずGNDに落としておいたが、これが原因のようだ、4.7Kでプルダウンしたら、安定して書き込めるようになった。
多分、フラッシュ書き込み時などに一瞬出力になる場合があるのだろう・・
※ボーレートは関係無かった。

Makefile 、環境毎の違いを補正

既に、「glfw_app」などで行っていたのだが、RXマイコンの開発環境でも、boost を使うようになった為、Makefile の修正を行った。
※プロジェクトの数が多いので、主要な部分のみ行った。

boost は、パッケージマネージャーでインストールするのが標準的となったので、環境毎にパスを追加で指定しなければならない。
そこで、以下のようなスクリプトで、環境を識別して、内部変数を設定している。

# Include path for each environment
ifeq ($(OS),Windows_NT)
SYSTEM := WIN
LOCAL_PATH  =   /mingw64
else
  UNAME := $(shell uname -s)
  ifeq ($(UNAME),Linux)
    SYSTEM := LINUX
    LOCAL_PATH = /usr/local
  endif
  ifeq ($(UNAME),Darwin)
    SYSTEM := OSX
    OSX_VER := $(shell sw_vers -productVersion | sed 's/^\([0-9]*.[0-9]*\).[0-9]*/\1/')
    LOCAL_PATH = /opt/local
  endif
endif

INC_SYS     =   $(LOCAL_PATH)/include

これで、Windows(MSYS2)、Linux、OS-Xの違いを識別して、適切な「パス」を設定できる。
OS-X では、OS のバージョンも抜き出している。

他、emacs を起動した場合の TAB を強制的に指示する為、以下の「おまじない」をファイルの先頭に追加した。

# -*- tab-width : 4 -*-

さらに、既に2019年だが、今まで「C++14」を指定していたコンパイルオプションを「C++17」に変更しておいた。

PFLAGS      =   -std=c++17 $(CP_OPT) $(OPTIMIZE) $(MCU_TARGET) $(DEFS)

WR250Xのメンテナンス

昨日、バイクで出かける用事があり、気になっていたメンテナンスを行った。

フレームが微妙に錆びていて、その部分を補修した。

色々な方法があると思うが、今回は、「サビ転換剤」を使った。

方法は簡単で、ワイヤーブラシで、赤サビの部分の汚れや、サビなどを落として、上記の液体を塗るだけ。
マフラーにも塗っておいたが、高温になるので、効果があるのかは微妙。

様子を見て、上から塗装しておこうと思う。

中古住宅のリホーム、お風呂の換気扇修理

お風呂には換気扇がついている、ただ、動かすとかなりウルサイ。
そこで、取り外して分解してみた。
手でファンを回すと多少ゴリゴリしてる、どうやらベアリングが駄目になっているようだ、25年以上たっているので当たり前ではある。

最初、ベアリングに潤滑剤をスプレーして済まそうと思ったが、交換してみる事にした。
モーターは、二個あり、大きいモーター(コンデンサモーター)と小さいモーター(くまとりコイル式)で、誘導モーターだが、どちらも、軸にベアリングが入っている。

大きい方は、隙間があり、油圧プレスを使って簡単にベアリングが抜けたが、小さい方は、ホルダーがアルミ製で、どうやって抜いたらよいか思案した。

片方のホルダーは、貫通穴が開いているので、6.5mmくらいのシャフトを反対側から入れて、叩いて抜いたが、もう片方は、塞がっている。
内径6mmのベアリングプーラーも持っていないので、6.5mmのドリルでホルダーに穴をあけ、同じようにシャフトで叩いて抜いた。

修理以前に、中にゴミが色々溜まってるし、「何じゃコリャー?、キモイ・・」とゆー謎の物体が・・(ツチバチの巣?)

ベアリングは注文して2日で届いた。
待つ間、ホームセンターで、サビで腐食した代わりの、タッピングビス(丁度同じようなサイズのステンレス製があった)、Eリングなどを購入して準備していた。


油圧プレスは、ほんと便利!

修理が終わり(分解する前に写真を撮っておけば良かった・・、ネジの種類が多く、かなり迷った・・・)、元に戻して(それなりに重いので、外すより大変)、ようやく完了!
言うまでも無く、静かで快適になった。
換気は、小さいファンで、大きいファンは、熱風送風用なんだな・・

github のREADMEを英語ベースにする試み・・

最近、VSCodeでマークダウンを編集している。
これが、凄く快適で、画面をスプリットして、リアルタイムに描画イメージを確認しながら作業出来る。

そんな事もあって、トップページの README を英語にして、日本語はリンクにしてみた。
自分、英語が得意では無いので、翻訳は、Google 先生にほぼお任せ状態で、ネィティブな人には、かなり痛い英語かもしれない。
まぁ、無いよりはマシ程度と考えている。

まだ、全部を翻訳していないが、順次追加していこうと思う。

VSCode にはマークダウンを PDF 化する拡張機能があり、これを使う事で、ブラウザ以外でも読めるファイルが作れる事から、RXマイコン関連の事や、ブログで書いた細かい話などをまとめた。

https://github.com/hirakuni45/RX/blob/master/docs/cpp_spin_rx_story.md

これもまだまだ未完成なので、今後加筆修正していこうと思う。

Visual Studio Code を使う為の設定

自分は、マルチプラットホームにこだわりがあり、色々な異なった環境でも同じような操作性を提供できる事に注目している。

Visual Studio Code は、マイクロソフトのオープンソースによるもので、アプリケーションとしてはテキストエディターだが、単なる文書を書くだけではない、色々な拡張機能を追加でき、カスタマイズ出来る点で大きな広がりがある。
拡張機能は、emacs が先人でもあるが、emacs がスタートした時代は古く、VSC は最近の「流行」を取り入れて斬新な物になっている、emacs を現代風に作り直したアプリケーションとも言えると思う。
※emacs は Lisp だが、VSCは Json なので、より多くの人に受け入れやすい。

「創作活動のほとんどは、文書を作る動作が起点になっている。」と言う事実に改めて気がつく。

既に多くの人が、VSC を利用した拡張機能をリリースしており、自分で新規に作らなくても、インストールして利用する事が出来る。
また、VSC の設定方法や Tips など豊富にある、ただ、目的の機能を実現する方法は複数(無限)あり、VSC のバージョンとも関連するので、シンプルな方法を選んで取り込む必要がある。

自分が VSC で感激した点:
・拡張機能が豊富で、検索してインストールする事がコンビニエンス。
・Git と連携していて、git で行う操作を標準で色々行える、git 用フロントエンドアプリを使うより強力で判りやすく便利かもしれない。
・Markdown 形式を標準でサポートしており、プレビューしながら記述出来る。
※拡張機能を入れると PDF 化する事も出来る。
・Terminal 機能があり、MSYS2 の bash などを呼び出して使う事が出来る。
・C++ では非常に有能なインテリセンスが使える。
※インクルードパスの設定が重要
・プラットホーム毎の「固有」設定が出来る。
・比較的軽い。

それでも、小躍りする前に事前の調査が重要、「道具」類は、良さそうと思って使ってみても、細かいとこで気に入らない事も多い。
少し使ってみて、「何だコレ!」って思った事もあったけど、やはり「短所」より「長所」が勝っており、将来性を考えたら、コレを使わない理由が無い事に気がつく。

今まで emacs を中心に使ってきた、ただ、積極的に Lisp を使う気になれなくて、ほぼコードを書くだけで使っていた。
※知り合いは、自分で Lisp を書いて、自分の欲しい環境を色々実装している。
それを横目で観ていて、自分もやってみたいと思っていたが、もう少しハードルを下げた方法は無いのかとも思っていた。

最近の VSC では、「ワークスペース」と言う概念を使う事ができる点で、異なった環境を柔軟に切り替える事が出来る。
※以前は、フォルダーのルートを指定するシンプルな物だったが、それを少し拡張して、複数フォルダーに関連するファイル郡を一括して扱う事が出来るようになった。
「ワークスペース」では、設定が書かれた専用ファイルを開く事から始めるので、固有の設定を取り込む事が出来る。

まずインストール。
MSYS2 は現状でも、ツールの中心なので、インストールする、詳しい方法は、https://github.com/hirakuni45/RX を参照の事。
※MSYS2 は MinGW とは異なったアプリケーションなので、必ずMSYS2 を使うように。

・Terminal で MSYS2 の bash が起動出来るようにする設定、「settings.json」を編集して、以下のように追加しておく。
※「settings.json」の直接編集の正しい方法は「ぐぐって」もらうとして、自分の場合は、
「設定」などで、「settings.json で編集」などのリンクがあるので、それをクリックして編集している。
※キーワードを入れると候補が表示されるので判りやすい。

{
    "git.ignoreLegacyWarning": true,
    "git.autoRepositoryDetection": "subFolders",
    "C_Cpp.default.cppStandard": "c++14",
    "C_Cpp.default.cStandard": "c99",
    "files.autoSave": "afterDelay",
    "C_Cpp.default.intelliSenseMode": "gcc-x64",
    "C_Cpp.intelliSenseEngineFallback": "Disabled",
    // MSYS2 bash のパスと、起動設定
    "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
    "terminal.integrated.env.windows": {
        "MSYSTEM": "MINGW64",
        "CHERE_INVOKING": "1"
    },
    "terminal.integrated.shellArgs.windows": [
        "--login"
    ],
    "terminal.integrated.cursorStyle": "line",
    "editor.renderWhitespace": "all"
}

※必要な部分のみコピーする場合は、「,」に注意

・拡張機能を入れよう~
※「拡張機能」ボタンを押して、検索ボックスでキーワードを入れれば、候補がリストされ、簡単にインストール出来る。

(1) C/C++ (Microsoft)
※自分は、マイクロソフトの物を入れているが、検索すると複数の物が見つかるので、自分の嗜好に合った物を使えば良いだろう。
※現段階で、gcc などでインテリセンスを機能させる設定が判っていない。

(2) Emacs Friendly Keymap
※とりあえず、キーバインドを Emacs 風にしている、vi や他のエディター用もあるし、自分でキーバインドを設定する事も出来る。
※VSCでは、「ESC」キーは別の意味で使われており、一般的な Emacs のメタキーとして利用するには反故が多いようだ。
なので、「M-v」は「ALT+v」として機能する、今まで「ESC」を使ってきたが、矯正する必要がありそうだ・・・
まぁ確かに、ESC を押してから v を押すより、ALT+v の方が利便性が高い。

(3) Japanese Language Pack for VS Code (Microsoft)
英語のメニューでも、そんなに困らないが、日本語の対応は流石に本家だけあって良く出来ている


最後はインテリセンスの設定だが、MSYS2 上の gcc g++、clang などで運用するには、もう少し調査が必要だと思う。

思いつくインクルードパスを設定しても、思ったように、インテリセンスが機能しない・・・

色々調べたが、何故思ったように機能しないかも不明で、WEBにある「こうすればおけー」と言った情報を見て、そのように設定してみたが、やはり駄目・・

何か特殊な設定をするのか、別の拡張機能を入れるのか、謎である・・・

清涼飲料水の功罪

自分はアトピーがあるので、いわゆる「食品添加物」には敏感になっている。
原因が判らないし、薬は利かない状態なので、どうしても食べる物に関して無頓着ではいられない。

清涼飲料水の中では、得に炭酸飲料が好きで、「ドクターペッパー」ファンでもあるのだが、最近はなるべくコントロールして飲むようにしている。

ドクペに限らず、清涼飲料水は、どれも同じような組成で、しいて言えば「色」と「香り」が異なる程度の違いしかない、元々は果汁(ジュース)を人工的に作り出す研究から発達したものと思われる。

主な成分は:
(1)加糖ブドウ糖液
(2)酸味料(クエン酸、 アスコルビン酸)
(3)香料
(4)着色料
(5)水、又は炭酸水
(6)保存料

などで、大抵の清涼飲料水は以上の材料から作られている。
これは、「ジュース」に代表される物の組成を真似た物で、極めて安価に作る事が出来る。
※清涼飲料水でもっとも大きなコストを占めるのは輸送費とCM費だろう。

(1)加糖ブドウ糖液は、「甘み」で、とうもろこしデンプン(コーンスターチ)から酵素反応で「ブドウ糖」を作り、さらにそれをもう一度酵素反応させて(加糖)作るもので(二度行うのは、一度では甘さが足りない為)、砂糖とほぼ同じ糖度でありながら、非常に安価に作る事が出来る。
※「砂糖」はコストが高いのと、嗜好的に「重い」ので使われる事が少ないが、エナジードリンクのような単価が高い飲料には使われる事があるようだ。
※また、ゼロカロリーにする為、「 スクラロース、アセスルファムカリウム、アスパルテーム」などの人口甘味料が使われる場合もあるようだが、コストの関係と、大量に取ると腹を下す事などから主流では無いようだ。

(2)一般に、果物には「酸味」が含まれているので、この酸味を人工的に添加する事でジュースと同等の飲み応えを提供する、通常クエン酸が使われるが、ビタミンCとして「アスコルビン酸」を補助的に使う場合もある、アスコルビン酸を100mg添加するとレモン50個分のビタミンCと言う事が出来る(レモン1個に2mg入っている)。

また、人間の舌は、酸味が含まれると、糖分を感じにくい性質があり、糖分だけで見ると、極めて高い糖度が含まれる事になる。
※「酸味」を加えない「さとう水」の状態では、甘すぎて飲めない程の「甘さ」となっている。(手に着くと凄くベタつくので判ると思う)
※糖度を少なくして、酸味も少なくすると、「パンチ」が無く、「うす味」と感じるので、セールスに結びつかない事から、そのような試みのほとんどは失敗しているようだ。(甘くないりんごやみかんが売れない現実を考えれば良くわかる話ではある)

※100%ジュースは天然なので体に良いと勘違いしている人がいるが、「酸味料」の説明通り、ジュースの場合も糖度は非常に高い、500ccのオレンジジュースで何個オレンジを食べたのと同等なのかを考えれば判ると思うが、ジュースを多く摂取するのは同じように糖分過多となる。
それでも、清涼飲料水よりはマシなのかもしれない。

(3)(1)だけでは甘すぎて飲めないが、(2)を添加する事で美味しく飲める(サイダーの状態)ようになるのだが、色々な香料を添加する事で、嗜好的な飲み物になる。
香料は一般に揮発性の科学物質で、主な成分はエステル系と思われる、最近では、分析の精度と、合成の精度が向上して、殆どの物は人工的に作り出せるようになった。
たとえば、オレンジ香料を使って人工的に作ったオレンジジュースもどきと、100%オレンジジュースでブラインドテストをしたら、「本物」を飲み分ける事が出来る人は殆どいないと思われる。
※エンジンオイルでエステルを添加したものがあるが、フルーティな匂いがするw

(4)最近「無色透明」の清涼飲料水が売られるようになったが、これは販促のネタ切れで、何かのキッカケ作りで新しい事を始めただけで、本流になるとは思えない、オレンジ風味の飲み物ならそれらしい色が着いている方が「説得力」がある、着色料は、合成と天然があり、よく知られている天然着色料は、「カイガラ虫」(赤色)の物か、「カラメル色素」(茶色)だろうか。
合成(?号と表記されている物)は、主に石油精製の過程で出てくる副産物を利用しているようだ。
合成の方が、設計した色彩を作りやすいのと、鮮やかな方がセールスに結びつくので、合成がより多く使われる。
また、「合成着色料」を本気で敬遠する人は全体の2%程度と言われているのと、仮にそれが引き金となって病気になったとしても、メーカーの責任として立証する事はほとんど不可能なので、販売側もほとんど気にしていないようだ。
※動物実験で安全を確認していても、人間に安全なのかは微妙だ。
※「見た目」はセールスに非常に大きく影響する。

(5)水だが、通常、水道の水をさらに精製して不純物を取り除いた「純水」が使われる。
「天然水」が使われる事もあるが、合有するミネラル分と何かが反応して不都合な事が起こる場合を考慮して、限定的に使われる。
炭酸水は、ジュースには無い嗜好的要素があり、好んで使われる、糖分があると、炭酸が抜けにくい効果もある。

清涼飲料水は、たまに飲むのなら問題無いと思うが、「糖分」が非常に多いので、飲みすぎには注意が必要と思う、特に子供には・・
100%ジュースもその性質は同等なので、やはり飲みすぎには注意がいる、一番妥当なのはミネラルウオーターという事になる。
※100%ジュースより、果物を丸ごと食べた方が食物繊維を同時に取れて量も少なくて済むので都合が良い。
※昨今、お茶もかなり怪しくなりつつあり、避けている。

(6)保存料は、流通の過程(温度変化や、製造日数などによる劣化を防ぐ)で、品質を保つ為に添加されている、通常「 安息香酸Na 」などが使われるよいだが、人体にどのような影響があるのかは不明。
以前に、「 安息香酸Na 」と「 アスコルビン酸 」が反応して有毒な「ベンゼン」が生成されている事が判り、製品が回収された事があったようだ。
「ビタミンC」は、それ自体「保存料」として使われている場合がある。

アスコルビン酸はビタミンCとして使われるが、それは「ビタミンC郡」の中の一つで、天然のビタミンCとも異なっている、たとえば、オレンジに含まれるビタミンCとりんごに含まれるビタミンCの組成は異なっており(郡としては同類)、科学的効果も異なるものと思われるが、その微妙な違いが身体的にどのような影響をもたらすのかは判っていないようだが、大雑把に、「色々なビタミンCを取る必要があるだろう」と言う事だと思う。
※人間が自身で合成できないもので、身体の維持に必要な成分。

「食物繊維」として、ポリデキストロース を添加している物もあり「レタス○個分の食物繊維」と言っているが、水溶性の部分のみなので、効果はかなり怪しい。
※みかんを薄皮ごと1個分食べれば、それだけで、かなり便秘には効果がある。

スポーツ飲料も、糖分はかなり多く含まれるので、飲む量に応じて希釈して飲む方が良さそうだが、他の選択枠もある。
※糖分を少なくすると「売れない」現実がある。

スポーツ時の汗で出て行くミネラルを補給するもっとも強力なスポーツドリンクは「あま酒」(さけ粕に砂糖を入れた物はNG)で、米を麹で分解した時にブドウ糖の他、各種ビタミン等、副産物が豊富に含まれる、そのままではやはり糖分が多いので、希釈して飲む事になるが、点滴より効果的と言う人もいるくらい栄養豊富な飲み物で、直ぐに吸収されるので即効性が高い、米の粕が残り、口当たりが良くないのが欠点と言える。
※しょうがを入れて飲むと、甘みが抑えられるのは、経験的に得た知恵なのだろう、酸味料と同等な効果があるのは想像しやすい。